1

ディレクトリを実行してそこでファイルを処理するforループがありますが、一度に特定の数のファイルのみを処理したいと思います。たとえば、1000個のファイルがあるディレクトリがありますが、1日に処理できるのは250個だけなので、スクリプトを最初に実行すると、最初の250個、次の250個というように処理されます。

まず、ファイル名を、すでに同期されているファイルの名前を記録しているXMLファイルと照合して、2回目の処理を行わないようにします。次に、変数がある次のn個のファイルを処理したいと思います。synclimit = n

次のように、範囲内のステートメントをforループに追加することを考えました。

tree = ET.parse("sync_list.xml")
root = tree.getroot()
synced = [elt.text for elt in root.findall('synced/sfile')]
for filename in os.listdir(filepath) and in range (0, synclimit) :
    if fnmatch.fnmatch(filename, '*.txt') and filename not in synced:
    filename = os.path.join(filepath, filename)
    result = plistlib.readPlist(filename)

ただし、これにより、ディレクトリ内の最初のn個のファイルのみが毎回チェックされると確信しています。範囲ステートメントをifステートメントに追加する必要がありますか?お気に入り:

tree = ET.parse("sync_list.xml")
root = tree.getroot()
synced = [elt.text for elt in root.findall('synced/sfile')]
for filename in os.listdir(filepath):
    if fnmatch.fnmatch(filename, '*.txt') and filename not in synced and in range (0, synclimit):
    filename = os.path.join(filepath, filename)
    result = plistlib.readPlist(filename)

またはこれを行うためのより簡単な方法はありますか?ありがとうございました。

4

1 に答える 1

1

別のカウンターを保持し、それをインクリメントしてから、に達したかどうかをテストしますsynclimit。そのような単純な。ここで賢くなりすぎる必要はありません。

processed = 0
for filename in os.listdir(filepath):
    if not filename.endswith('.txt') or filename in synched:
        continue
    # process
    processed += 1
    if processed >= synclimit:
        break  # done for today.

または、os.listdir()リストを返すので、ファイル名の同期済みリストがセットに含まれている場合はそれをフィルタリングしてから、最大サイズにスライスすることができます。

synced = set(elt.text for elt in root.findall('synced/sfile'))
to_process = [f for f in os.listdir(filepath) if f.endswith('.txt') and f not in synched]

for filename in to_process[:synclimit]:
    # process

.endswith('.txt')単純なファイルマッチャーを使用する代わりに、テストするだけであることに注意してください。テストは同じことになります。

于 2012-11-22T16:35:17.400 に答える