3

数千のファイルを含むディレクトリがあります。大きなディレクター内にサブディレクトリを作成し、新しく作成された各ディレクトリに正確に 150 個のファイル (拡張子でフィルター処理) を移動できるようにしたいと考えています。私を動かすためのガイダンスが欲しいです。これが私が始めているささいなことです:

wd = os.chdir(r'foobar')

allgzs=[]

for file in os.listdir(wd):
    if file.endswith('asc.gz'):
       allgzs.append(file)

for gz in allgzs:


# For every 150 .gz files: 
# Create directory -- os.mkdir?
# Move files into directory  -- shutil.move?
4

5 に答える 5

5

grouper私は次の実行で長いシーケンスを生成する関数を思いついたn

import itertools
def grouper(S, n):
    iterator = iter(S)
    while True:
        items = list(itertools.islice(iterator, n))
        if len(items) == 0:
            break
        yield items

そこから、あなたはあなたが望むことをかなり簡潔に行うことができます:

import glob, os, shutil
fnames = sorted(glob.glob('*asc.gz'))
for i, fnames in enumerate(grouper(fnames, 150)):
    dirname = 'batch%d' % i
    os.mkdir(dirname)
    for fname in fnames:
        shutil.move(fname, dirname)
于 2012-09-24T06:25:40.883 に答える
2

見てみましょう、私はこの状況で私が何をするかを列挙します。

  • ファイルのリストを取得する-X
  • すべてのファイルをループする-X
  • ファイルにピリオドが1つしかないことを確認してください-O
  • 不要な拡張機能を除外する-X
  • 必要な拡張機能を新しいリストに追加します-O
  • 新しいリストのすべてのファイルをループします-O
  • それらをリストに追加し、カウンターを使用して、150-Oがいつあるかを確認します
  • 150個のファイルがある場合は、それらをすべて移動します-O
  • ループに戻る-O
  • すべてをループしてコピーすると、完了です。

そこにあります。また、これは決してこれを行うための最も効率的または最良の方法ではありません、それは私がそうする方法です。

編集:サンプルコード:

wantedexts = [".jpg",".png",".randomext"]
wantedfiles = []

for f in files: #the files from the folder
    allowedext = 0
    for exts in wantedexts:
        if f.endswith(exts):
            allowedext = 1
            break
    if allowedext:
        wantedfiles.append(f)

counter = 0
countertwo = 0 #used to tell when you get to the end of the files
copyfiles = []
for f in wantedfiles:
    if counter == 150 or countertwo == len(wantedfiles):
        for fc in copyfiles:
            copy    #too lazy to type in real copy code
        counter = 0
        copyfiles = []
    copyfiles.append(f)
    counter += 1
    countertwo += 1

ほとんどあなたのためにコードを書きましたが、何でも。Countertwoは、最後のアイテムをコピーするために使用されます(残りのアイテムがある可能性が高いため)。

于 2012-09-24T05:07:30.583 に答える
2

すでに書いたコードを残しておきたい場合は、次の直感的な方法でコードを完成させることができます。

import os
import shutil

wd = os.chdir(r'foobar')

allgzs=[]

for file in os.listdir(wd):
    if file.endswith('asc.gz'):
       allgzs.append(file)

n = 1
name = "subdir%i" %n
for gz in allgzs:
    if not os.path.exists(name):
        os.mkdir(name)
    shutil.move(gz, name)
    if len(os.listdir(name)) == 150:
        n += 1
        name = "subdir%i" %n
于 2012-09-24T06:24:05.517 に答える
1

ここでは、リスト内包表記を使用してファイル名のリストを作成しています。あなたのリストは、os.listdirまたはglob.glob('*asc.gz')

>>> files = ['foo{}.gz'.format(i) for i in range(5000)]
>>> for i, fname in enumerate(files):
...     if i%150 == 0:
...         dirname = "bar{}".format(i//150)
...         os.mkdir(dirname)
...     print fname,"-->", dirname
...     shutil.move(fname, dirname)
... 
foo0.gz --> bar0
foo1.gz --> bar0
foo2.gz --> bar0
foo3.gz --> bar0
foo4.gz --> bar0
foo5.gz --> bar0
... 

ここでの秘訣は、処理中のファイルの数を数え、150それを除算してディレクトリにマップすることです。//単に整数除算を意味/します (Python2 と同じ)

于 2012-09-24T05:34:27.667 に答える
0

これにはglobモジュールを使用できます

for file in glob.glob('*.gz'):
    #Do Stuff
于 2012-09-24T05:08:54.470 に答える