39

フォルダー内に 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 を読み取ります。

誰かが正しい順序を得る方法を手伝ってくれますか?

4

5 に答える 5

88

ファイルシステム上のファイルはソートされていません。sorted()次の関数を使用して、結果のファイル名を自分で並べ替えることができます。

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']
于 2012-08-23T14:31:19.290 に答える
10

ステートメント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 桁幅の数字を含む文字列に変換されます。

于 2012-08-23T14:31:07.823 に答える
1

ファイル名の数字を分離して、並べ替えを「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 関数は、ファイル名に数字が含まれていること、およびその数字がファイル名にのみ含まれていることを前提としています。その関数を変更して、並べ替える必要のある数値を分離する必要があるだけ複雑にすることができます。

于 2012-08-23T14:50:28.313 に答える
0
glob.glob(os.path.join( '*.txt'))

文字列のリストを返すので、pythons sorted() functionを使用してリストを簡単にソートできます。

sorted(glob.glob(os.path.join( '*.txt')))
于 2012-08-23T14:33:11.530 に答える
-4
for fname in ['file9.txt','file10.txt','file11.txt']:
   with open(fname) as f: # default open mode is for reading
      for line in f:
         # do something with line
于 2012-08-23T14:31:47.647 に答える