マリア:
私の仕事は、3つのファイルのカテゴリ(それぞれが私の元のPythonのコードで異なる機能を持っている)、そのファイルに割り当てるシーケンス番号に私の必要性を処理の終わりにを処理することです。、そのカテゴリに分離されています。
私はそれを行うための最善のアプローチを提案するために私を助けてくださいPLEASE、私の要件のサンプルコードを入れてみました。
「Appleのキーワードですべてのファイルは、他の2つのカテゴリーに別々のシーケンス番号、および同じ方法で終了します。
import shutil
Apple = 1
def AppleNum():
global Apple
Apple += 1
return str(Apple).zfill(3)
Banana = 1
def BananaNum():
global Banana
Banana += 1
return str(Banana).zfill(3)
Orange = 1
def OrangeNum():
global Orange
Orange += 1
return str(Orange).zfill(3)
def List_files(filepath, substr):
X = Y = []
for path, subdirs, files in sorted(os.walk(filepath), reverse=True):
for name in files:
X.append(os.path.join(path, name))
if substr == 'AAA':
return [str for str in Y if any(sub in str for sub in substr) and 'xml' in str]
elif substr == 'BBB':
return [str for str in Y if substr in str]
elif substr == 'CCC':
return [str for str in Y if substr in str and '.csv' in str]
else:
return ""
def copy_func():
for file in List_files(test_path, 'AAA'):
seq = AppleNum()
shutil.copy(file, 'files/' +str(file) + _ + seq)
for file in List_files(test_path, 'BBB'):
seq = BananaNum()
shutil.copy(file, 'files/' +str(file) + _ + seq)
for file in List_files(test_path, 'CCC'):
seq = OrangeNum()
shutil.copy(file, 'files/' +str(file) + _ + seq)
if __name__ == '__main__':
copy_func()
Please help if there is any other best approach to do this, because as per my new requirements 3 categories became 12.
入力ファイルは、以下のようにしている場合..
Apple_oo.xml
Banana_dsh
Apple_bb.xml
Orange.csv
Orange_dhj.csv
Orange_sk.csv
Banana_dhs
シーケンス番号を割り当てた後予想される出力:
Apple_oo.xml_2
Banana_dsh_2
Apple_bb.xml_3
Orange.csv_2
Orange_dhj.csv_3
Orange_sk.csv_4
Banana_dhs_3
提案で私を助けてください..
前もって感謝します。
スチュアート:
発電機は、フィルタリング、ファイル名の一覧を表示し、使用することを確認しenumerate
、各1のインデックス番号を作成します。
import shutil
import os
def filtered_files(path, filters):
""" List files in the path whose filenames contain the given string filters """
for p, subdirs, files in sorted(os.walk(path), reverse=True):
for name in files:
if all(f in name for f in filters):
yield os.path.join(p, name)
def make_numbered_copies(files, outfile="{name}_{index:03}", start=0):
for i, file in enumerate(files, start=start):
shutil.copy(file, outfile.format(name=file, index=i))
def main():
filter_groups = [("AAA", "xml"), ("BBB", ), ("CCC", ".csv")] # add more as needed
for filters in filter_groups:
files = filtered_files(path, filters)
make_numbered_copies(files, outfile="files/{name}_{index:03}", start=2)
if __name__ == '__main__':
main()
あなたは適応する必要があるかもしれませんfiltered_files
あなたのフィルタがある複雑な方法に応じて機能を。使用を検討してくださいfnmatch
(例えばfnmatch(name, "*AAA*.xml")
、より複雑なフィルタの場合)または正規表現を。