フォルダーにfile9.txt、file10.txt、file11.txtの3つのファイルがあり、この特定の順序でそれらを読みたいとしましょう。誰でもこれで私を助けることができますか?
今、私はコードを使用しています
import glob, os
for infile in glob.glob(os.path.join( '*.txt')):
print "Current File Being Processed is: " + infile
そして、最初にfile10.txt、次にfile11.txt、そしてfile9.txtを読み取ります。
誰かが正しい順序を得る方法を手伝ってくれますか?
ファイルシステム上のファイルはソートされません。 sorted()
function を使用して、結果のファイル名を自分でソートできます。
for infile in sorted(glob.glob('*.txt')):
print "Current File Being Processed is: " + infile
os.path.join
コード内の呼び出しはノーオペレーションです。引数が1つだけの場合、何も行わず、その引数を変更せずに返します。
ファイルはアルファベット順に並べ替えられ、10
前 9
。カスタムキー機能を使用して、並べ替えを改善できます。
import re
numbers = re.compile(r'(\d+)')
def numericalSort(value):
parts = numbers.split(value)
parts[1::2] = map(int, parts[1::2])
return parts
for infile in sorted(glob.glob('*.txt'), key=numericalSort):
print "Current File Being Processed is: " + infile
numericalSort
関数は、ファイル名の数字を分割し、実際の数字に変換し、並べ替えの結果を返します。
>>> files = ['file9.txt', 'file10.txt', 'file11.txt', '32foo9.txt', '32foo10.txt']
>>> sorted(files)
['32foo10.txt', '32foo9.txt', 'file10.txt', 'file11.txt', 'file9.txt']
>>> sorted(files, key=numericalSort)
['32foo9.txt', '32foo10.txt', 'file9.txt', 'file10.txt', 'file11.txt']
glob.glob( ... )
式の中にsorted( ... )
式をラップして、結果のファイルのリストをソートできます。例:
for infile in sorted(glob.glob('*.txt')):
sorted
に比較関数を指定するか、key= ...
引数を使用して、ソートに使用されるカスタムキーを指定します。
例:
次のファイルがあります。
x/blub01.txt
x/blub02.txt
x/blub10.txt
x/blub03.txt
y/blub05.txt
次のコードは、次の出力を生成します。
for filename in sorted(glob.glob('[xy]/*.txt')):
print filename
# x/blub01.txt
# x/blub02.txt
# x/blub03.txt
# x/blub10.txt
# y/blub05.txt
主要な機能が追加されました:
def key_func(x):
return os.path.split(x)[-1]
for filename in sorted(glob.glob('[xy]/*.txt'), key=key_func):
print filename
# x/blub01.txt
# x/blub02.txt
# x/blub03.txt
# y/blub05.txt
# x/blub10.txt
編集:おそらくこのキー機能はファイルをソートできます:
pat=re.compile("(\d+)\D*$")
...
def key_func(x):
mat=pat.search(os.path.split(x)[-1]) # match last group of digits
if mat is None:
return x
return "{:>10}".format(mat.group(1)) # right align to 10 digits.
それは確かに改善することができますが、私はあなたがポイントを得ると思います。数字のないパスはそのまま残され、数字のあるパスは幅が10桁の数字を含む文字列に変換されます。
glob.glob(os.path.join( '*.txt'))
文字列のリストを返すので、pythons sorted()function を使用してリストを簡単にソートできます。
sorted(glob.glob(os.path.join( '*.txt')))
ファイル名の番号を分離することにより、ソートを「ASCIIBetical」から数値に変更する必要があります。次のようにできます:
import re
def keyFunc(afilename):
nondigits = re.compile("\D")
return int(nondigits.sub("", afilename))
filenames = ["file10.txt", "file11.txt", "file9.txt"]
for x in sorted(filenames, key=keyFunc):
print xcode here
Glob.glob( "*。txt")の結果でファイル名を設定できる場所。
さらに、keyFunc関数は、ファイル名に数字が含まれており、数字はファイル名のみにあると想定しています。その関数を、ソートする必要のある数を分離するのに必要なだけ複雑になるように変更できます。