パイソン:各機能の異なるファイル数列を生成します

マリア:

私の仕事は、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")、より複雑なフィルタの場合)または正規表現を。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=383947&siteId=1