0

入手した大量のファイルを管理するための小さなスクリプトを書きたいと思います。これらのファイルの名前は複雑で異なりますが、名前のどこかに番号が含まれています。その番号を取得し、ファイル名の前に配置して、ファイルシステムに論理的にリストできるようにします。

os.listdirを使用してこれらすべてのファイルのリストを取得しましたが、これらのファイル内の番号を見つける方法を見つけるのに苦労しています。正規表現を確認しましたが、これが正しい方法かどうかわかりません。

例:

import os
files = os.litdir(c:\\folder)
files
['xyz3.txt' , '2xyz.txt', 'x1yz.txt']`

つまり、基本的に、私が最終的に欲しいのは次のとおりです。

1xyz.txt
2xyz.txt
3xyz.txt

私が今のところ行き詰まっているのは、リストファイルでそれらの番号(1、2、3)を見つけることです

4

2 に答える 2

2

この(テストされていない)スニペットは、正規表現アプローチを示しているはずです。コンパイルされたパターンのsearch方法は、数を探すために使用されます。見つかった場合、番号はファイル名の前に移動されます。

import os, re

NUM_RE = re.compile(r'\d+')

for name in os.listdir('.'):
    match = NUM_RE.search(name)
    if match is None or match.start() == 0:
        continue  # no number or number already at start
    newname = match.group(0) + name[:match.start()] + name[match.end():]
    print 'renaming', name, 'to', newname
    #os.rename(name, newname)

このコードが宿題の割り当てとしてではなく本番環境で使用される場合、有用な改善はmatch.group(0)、整数として解析し、先行ゼロの数を含むようにフォーマットすることです。そうfoo2.txtすれば02foo.txt、の前にソートされ12bar.txtます。これを実装することは、読者の練習問題として残されています。

于 2012-11-21T21:53:18.763 に答える
0

ファイル名の数字が整数(テストされていないコード)であると仮定すると、次のようになります。

def rename(dirpath, filename):
    inds = [i for i,char in filename if char in '1234567890']
    ints = filename[min(inds):max(inds)+1]
    newname = ints + filename[:min(inds)] + filename[max(inds)+1:]
    os.rename(os.path.join(dirpath, filename), os.path.join(dirpath, newname))

def renameFilesInDir(dirpath):
    """ Apply your renaming scheme to all files in the directory specified by dirpath """

    dirpath, dirnames, filenames = os.walk(dirpath):
    for filename in filenames:
        rename(dirpath, filename)
    for dirname in dirnames:
        renameFilesInDir(os.path.join(dirpath, dirname))

お役に立てれば

于 2012-11-21T21:56:44.690 に答える