9

100,000 を超えるファイルを含むフォルダーがあり、すべて同じスタブで番号が付けられていますが、先行ゼロはなく、番号は常に連続しているわけではありません (通常は連続していますが、ギャップがあります)。

file-21.png, 
file-22.png,  
file-640.png, 
file-641.png, 
file-642.png, 
file-645.png, 
file-2130.png, 
file-2131.png, 
file-3012.png, 

これをバッチ処理して、パディングされた連続したファイルを作成したいと思います。例えば:

file-000000.png, 
file-000001.png, 
file-000002.png, 
file-000003.png, 

ファイルを含むフォルダーを解析すると、希望for filename in os.listdir('.'):する順序で表示されません。当然のことながら、彼らは出てきます

 file-1, 
 file-1x, 
 file-1xx, 
 file-1xxx,

など

 file-2, 
 file-2x, 
 file-2xx, 

等々 数値の順に通すにはどうすればいいですか?私は完全なpython noobですが、ドキュメントを見て、マップを使用して数値部分のみをフィルタリングする新しいリストを作成し、そのリストを並べ替えて、それを繰り返すことができると思いますか? 100K を超えるファイルでは、これは重くなる可能性があります。どんなヒントでも大歓迎です!

4

6 に答える 6

8
import re
thenum = re.compile('^file-(\d+)\.png$')

def bynumber(fn):
  mo = thenum.match(fn)
  if mo: return int(mo.group(1))

allnames = os.listdir('.')
allnames.sort(key=bynumber)

これで、必要な順序でファイルが作成され、ループできます

for i, fn in enumerate(allnames):
  ...

宛先名で必要に応じてパディングされた累進番号i(0、1、2、...) を使用します。

于 2010-06-20T01:03:07.073 に答える
4

皆様のご提案ありがとうございました。さまざまなアプローチを学ぶために、すべてを試してみます。私が行った解決策は、ファイルリストで自然ソートを使用し、それを繰り返して名前を変更することに基づいています。これは提案された回答の1つでしたが、何らかの理由で現在は表示されなくなったため、承認済みとしてマークできません。

import os
files = os.listdir('.')
natsort(files)
index = 0
for filename in files:
    os.rename(filename, str(index).zfill(7)+'.png')
    index += 1

ここで、natsortはhttp://code.activestate.com/recipes/285264-natural-string-sorting/で定義されています。

于 2010-06-20T11:53:52.093 に答える
4

3 つのステップがあります。1 つ目は、すべてのファイル名を取得することです。2 つ目は、ファイル名の変換です。3 つ目は名前の変更です。

すべてのファイルが同じフォルダーにある場合、glob は機能するはずです。

import glob
filenames = glob.glob("/path/to/folder/*.txt")

次に、ファイルの名前を変更します。これを行うには、パディングを使用して印刷できます。

>>> filename = "file-338.txt"
>>> import os
>>> fnpart = os.path.splitext(filename)[0]
>>> fnpart
'file-338'
>>> _, num = fnpart.split("-")
>>> num.rjust(5, "0")
'00338'
>>> newname = "file-%s.txt" % num.rjust(5, "0")
>>> newname
'file-00338.txt'

ここで、それらすべての名前を変更する必要があります。os.renameそれだけです。

os.rename(filename, newname)

それをまとめるには:

for filename in glob.glob("/path/to/folder/*.txt"): # loop through each file
    newname = make_new_filename(filename) # create a function that does step 2, above
    os.rename(filename, newname)
于 2010-06-20T01:01:35.640 に答える
1

2段階のプロセスでそれをやってみませんか。すべてのファイルを解析し、パディングされた数字で名前を変更してから、それらのファイルを取得する別のスクリプトを実行します。これらのファイルは現在正しく並べ替えられており、名前を変更して連続するようにしますか?

于 2010-06-20T00:55:55.330 に答える
0

1) ファイル名の番号を取得します。2) 左にゼロを埋めます 3) 名前を保存します。

于 2010-06-20T00:55:44.240 に答える
0
def renamer():
    for iname in os.listdir('.'):
        first, second = iname.replace(" ", "").split("-")
        number, ext = second.split('.')
        first, number, ext = first.strip(), number.strip(), ext.strip()
        number = '0'*(6-len(number)) + number  # pad the number to be 7 digits long
        oname = first + "-" + number + '.' + ext
        os.rename(iname, oname)
    print "Done"

お役に立てれば

于 2010-06-20T04:58:37.707 に答える