通過谷歌搜索和短期在線課程自學 Python 新手失敗。我真的很喜歡 Python 并且想開始清理我的一些舊代碼。我正在尋找一種方法來簡化我冗長、重復的 IF/Else 陳述句。想知道是否有更好的方法來做到這一點,或者我正在做的事情很好,也許是一堂課或類似的事情。
這是我也提到的其中一個場景的示例代碼。
for file in os.listdir(src_dir):
if raceCheck == 'Race_1':
if fnmatch.fnmatch(file, '*1.pdf'):
upload_to_aws_site1(os.path.join(src_dir, file), 'official')
upload_to_aws_site2(os.path.join(src_dir, file))
print(file)
elif raceCheck == 'Race_2':
if fnmatch.fnmatch(file, '*2.pdf'):
upload_to_aws_site1(os.path.join(src_dir, file), 'official')
upload_to_aws_site2(os.path.join(src_dir, file))
print(file)
elif raceCheck == 'Race_3':
if fnmatch.fnmatch(file, '*3.pdf'):
upload_to_aws_site1(os.path.join(src_dir, file), 'official')
upload_to_aws_site2(os.path.join(src_dir, file))
print(file)
elif raceCheck == 'Race_4':
if fnmatch.fnmatch(file, '*4.pdf'):
upload_to_aws_site1(os.path.join(src_dir, file), 'official')
upload_to_aws_site2(os.path.join(src_dir, file))
print(file)
else:
print('I am here: ', file)
謝謝
uj5u.com熱心網友回復:
處理這個問題的最簡單(也可以說是最 Pythonic)的方法是使用 Race 到檔案名的映射,然后檢查映射中是否存在種族編號,如果存在,則使用檔案名。正如另一個類似的答案所建議的那樣,您實際上根本不需要遍歷dict比賽映射物件。
race_to_filename = {
'Race_1': '*1.pdf',
'Race_2': '*2.pdf',
'Race_3': '*3.pdf',
'Race_4': '*4.pdf',
}
for file in os.listdir(src_dir):
if raceCheck in race_to_filename:
filename = race_to_filename[raceCheck]
if fnmatch.fnmatch(file, filename):
upload_to_aws_site1(os.path.join(src_dir, file), 'official')
upload_to_aws_site2(os.path.join(src_dir, file))
print(file)
else:
print('I am here: ', file)
另外,請注意,如果您的種族名稱和檔案名始終與上述相似,那么您可以改為使用dict理解來定義映射,以節省一些時間:
race_to_filename = {f'Race_{i}': f'*{i}.pdf' for i in range(1, 5)}
uj5u.com熱心網友回復:
獲取的最后一個字符raceCheck并檢查檔案名是否以該字符加號結尾.pdf。
此外,由于raceCheck不會在回圈中更改,因此您應該在回圈外執行該部分。
if raceCheck.startsWith('Race_'):
digit = raceCheck[-1]
for file in os.listdir(src_dir):
if file.endswith(digit '.pdf'):
upload_to_aws_site1(os.path.join(src_dir, file), 'official')
upload_to_aws_site2(os.path.join(src_dir, file))
print(file)
else:
print("Don't know what to do with", raceCheck)
您也可以使用glob.glob()代替您自己的檔案名回圈。
if raceCheck.startsWith('Race_'):
digit = raceCheck[-1]
for file in glob.glob(os.path.join(src_dir, f"*{digit}.pdf")):
upload_to_aws_site1(file, 'official')
upload_to_aws_site2(file)
print(os.path.basename(file))
uj5u.com熱心網友回復:
不確定是什么fnmatch,因為您的示例不可重現。
充分利用對稱性,如下所示:
if raceCheck[-1] == file_name.split(".")[0][-1] and 0 < int(raceCheck[-1]) < 5:
upload_to_aws_site1(os.path.join(src_dir, file), 'official')
upload_to_aws_site2(os.path.join(src_dir, file))
print(file)
這將檢查 RaceCheck 中的最后一個字母是否與檔案名中的最后一個字母匹配。
您還可以使用or或連接多個條件and
uj5u.com熱心網友回復:
首先要做的是避免重復 100% 相同的代碼,并專注于不同的代碼。然后,如果你需要一個看起來像 switch 陳述句的結構,你可以定義這個 switch 函式:
def switch(v): yield lambda *c: v in v
并在迭代回圈中使用它:
for file in os.listdir(src_dir):
for case in switch(raceCheck):
if case('Race_1') : mask = '*1.pdf'
elif case('Race_2') : mask = '*2.pdf'
elif case('Race_3') : mask = '*3.pdf'
elif case('Race_4') : mask = '*4.pdf'
else:
print('I am here: ', file)
break
if fnmatch.fnmatch(file, mask):
upload_to_aws_site1(os.path.join(src_dir, file), 'official')
upload_to_aws_site2(os.path.join(src_dir, file))
print(file)
print('I am here: ', file)
我假設您的實際代碼比這更復雜,并且需要一個 switch 陳述句結構。否則,一個簡單的字典就足夠了:
masks = {f'Race_{n}':f'*{n}.pdf' for n in range(1,5)}
for file in os.listdir(src_dir):
mask = masks.get(raceCheck)
if not mask:
print('I am here: ', file)
continue
if fnmatch.fnmatch(file, mask):
upload_to_aws_site1(os.path.join(src_dir, file), 'official')
upload_to_aws_site2(os.path.join(src_dir, file))
print(file)
uj5u.com熱心網友回復:
像這樣重構長的、重復的if/else分支的最常見方法之一(至少在 Python 中)是使用回圈 dicts:
mapping = {
'Race_1': '*1.pdf',
'Race_2': '*2.pdf',
'Race_3': '*3.pdf',
'Race_4': '*4.pdf',
}
for file in os.listdir(src_dir):
for key, value in mapping.items():
if raceCheck == key and fnmatch.fnmatch(file, value):
upload_to_aws_site1(os.path.join(src_dir, file), 'official')
upload_to_aws_site2(os.path.join(src_dir, file))
print(file)
break
else:
print('I am here: ', file)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/361621.html
上一篇:查找關鍵字后的下一個和上一個單詞
下一篇:使用f字串列印不帶括號的串列
