我正在設計一個工具,它應該只從遵循命名約定的輸入檔案夾中提取 EXR 影像檔案:u#_v#.exr 或 u# v# #.exr(其中 # 表示整數或正非零整數)。應忽略所有其他檔案。我的作業代碼如下。但是,有沒有更好或更有效的方法來做到這一點?
def main():
# Add and read command line arguments
parser = argparse.ArgumentParser()
parser.add_argument('--input_folder', type=str, help='Directory where input images are located')
parser.add_argument('--output_folder', type=str, help='Directory where output image should be written')
args = parser.parse_args()
# Change directory to input folder and check all filenames belonging to our convention
os.chdir(args.input_folder)
all_files = check_combinatons_of_numeric_characters('u_v.exr', 'u_v_.exr')
print(all_files)
def check_combinatons_of_numeric_characters(convention1, convention2):
# Combinations for first convention which was supplied
split_convention1 = convention1.split('_')
convention1_combinations_alpha = np.array([])
convention1_combination1 = glob.glob(split_convention1[0] '[0-9]_'
split_convention1[1].split('.')[0] '[0-9].'
split_convention1[1].split('.')[1]
)
convention1_combination2 = glob.glob(split_convention1[0] '[0-9][0-9]_'
split_convention1[1].split('.')[0] '[0-9][0-9].'
split_convention1[1].split('.')[1]
)
convention1_combination3 = glob.glob(split_convention1[0] '[0-9][0-9]_'
split_convention1[1].split('.')[0] '[0-9].'
split_convention1[1].split('.')[1]
)
convention1_combination4 = glob.glob(split_convention1[0] '[0-9]_'
split_convention1[1].split('.')[0] '[0-9][0-9].'
split_convention1[1].split('.')[1]
)
convention1_combinations_alpha = np.concatenate((convention1_combination1,
convention1_combination2,
convention1_combination3,
convention1_combination4),
)
# Combinations for second convention supplied
split_convention2 = convention2.split('_')
convention2_combinations_alpha = np.array([])
convention2_combination1 = glob.glob(split_convention2[0] '[0-9]_'
split_convention2[1] '[0-9]_[0-9]'
split_convention2[2]
)
convention2_combination2 = glob.glob(split_convention2[0] '[0-9][0-9]_'
split_convention2[1] '[0-9]_[0-9]'
split_convention2[2]
)
convention2_combination3 = glob.glob(split_convention2[0] '[0-9]_'
split_convention2[1] '[0-9]_[0-9][0-9]'
split_convention2[2]
)
convention2_combination4 = glob.glob(split_convention2[0] '[0-9][0-9]_'
split_convention2[1] '[0-9][0-9]_[0-9]'
split_convention2[2]
)
convention2_combination5 = glob.glob(split_convention2[0] '[0-9]_'
split_convention2[1] '[0-9][0-9]_[0-9][0-9]'
split_convention2[2]
)
convention2_combination6 = glob.glob(split_convention2[0] '[0-9][0-9]_'
split_convention2[1] '[0-9]_[0-9][0-9]'
split_convention2[2]
)
convention2_combinations_alpha = np.concatenate((convention2_combination1,
convention2_combination2,
convention2_combination3,
convention2_combination4,
convention2_combination5,
convention2_combination6),
)
list_of_files = np.concatenate((convention1_combinations_alpha, convention2_combinations_alpha))
return list_of_files
if __name__ == '__main__':
main()
uj5u.com熱心網友回復:
我會簡單地匹配所有*.exr檔案,然后跳過不遵循模式的檔案。
import glob
import re
list_of_files = [file for file in glob.glob('*.exr')
if re.match(r'^u\d{1,2}_v\d{1,2}\.exr$', file)]
如果您也嚴格需要排除零,則正則運算式將需要使用(?!0)\d{1,2}而不是(在兩個地方);\d{1,2}或者(?!0\D)\d{1,2}如果您想允許前導零但不允許零后跟非數字。
更詳細地說,\d匹配一個數字,{1,2}表示前一個運算式出現一到兩次,并\D匹配一個不是數字的字符。(?!something)是一個否定的前瞻,如果此時的文本與正則運算式匹配,它會阻止匹配something。\.匹配文字點,^匹配檔案名的開頭和$結尾;大多數其他字符只是匹配自己。如需更詳細的說明,請查看Pythonre模塊的檔案和/或Stack Overflow標簽資訊頁面上的初學者資源。regex
在您閑暇時將結果串列轉換為資料框。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/511806.html
上一篇:為什么這里沒有將字串寫入檔案
