0

複数のファイルを 1 つのディレクトリにコピーし、500 単位でファイルをコピーして名前を変更したいと考えています。 in は 500 と呼ばれます…….files 1000-1500 はディレクトリ 1000 に入ります。

現在のコードは、配置されたファイルの名前を変更せず、代わりに正しい番号の新しいディレクトリに配置します。これはほんの始まりに過ぎませんでした。以下のコードは良いスタートだと思いますが、希望する結果を得るために変更を手伝ってくれる人はいますか?

import os, glob

target = 'C:\Pics'
prefix = 'p0'        
os.chdir(target)
allfiles = os.listdir(target)        
count = 500
for filename in allfiles:
    if not glob.glob('*.jpg'): continue
    dirname = prefix + str(count)
    target = os.path.join(dirname, filename)
    os.renames(filename, target)
    count +=1
4

1 に答える 1

2

os.listdir と glob.glob は同様の関数です。どちらもファイル/ディレクトリのリストを返すため、同じループには属しません(少なくとも、使用しようとしている方法ではありません)。主な違いは、os.listdir は単にディレクトリを取り、そこから基本的に (マイナス . と ..) を返すことです。glob.glob は、制限された正規表現形式で*.*含めることができる「グロビング パターン」を想定しています。* ? []ここで (glob.glob の代わりに) 考えているかもしれない関数は fnmatch.fnmatch で、単一のファイル名にグロビング パターンを適用します。

オス。listdir (パス)

パスで指定されたディレクトリ内のエントリの名前を含むリストを返します。リストは任意の順序です。特別なエントリ「.」は含まれません。および「..」は、ディレクトリに存在する場合でも。

可用性: Unix、Windows。

バージョン 2.3 で変更: Windows NT/2k/XP および Unix では、パスが Unicode オブジェクトの場合、結果 > は Unicode オブジェクトのリストになります。デコードできないファイル名は、引き続き文字列オブジェクトとして返されます。

グロブ。グロブ(パス名)

pathname に一致するパス名の空のリストを返します。これは、パス指定を含む文字列でなければなりません。パス名は絶対 (/usr/src/Python-1.5/Makefile など) または相対 (../../Tools/ / .gif など) にすることができ、シェル スタイルのワイルドカードを含めることができます。壊れたシンボリック リンクが結果に含まれます (シェルと同様)。

申し訳ありませんが、実際にファイルをモックアップしてこれをテストするのは面倒ですが、私はあなたのためにすべての作業を行います. しかし、これはうまくいくはずです(または、あなたが目指していると私が思うものに非常に近いでしょう)。;)

import os
import fnmatch
import os.path

target = 'C:\Pics'
os.chdir(target)
allfiles = os.listdir(target)
count = 500
for filename in allfiles:
    if not fnmatch.fnmatch(filename, '*.jpg'):
        continue
    if count % 500 == 0:
        dirname = 'p%04d' % count
        if not os.path.exists(dirname):
            os.mkdir(dirname)
    target = os.path.join(dirname, '%d.jpg' % count)
    os.rename(filename, target)
    count += 1
于 2012-05-17T16:50:13.613 に答える