2012-08-23 11 views
20

私は3つのファイルをfile9.txt、file10.txt、file11.txtというフォルダに入れて、この特定の順序で読みたいとします。誰もこれで私を助けることができますか?Pythonで特定の順序でファイルを読む

は、今私は、コード

import glob, os 
for infile in glob.glob(os.path.join('*.txt')): 
    print "Current File Being Processed is: " + infile 

を使用していますし、それがその後、file11.txt、その後file9.txt最初file10.txtを読み込みます。

正しい順序を取得する方法を教えてもらえますか?

答えて

41

ファイルシステム上のファイルはソートされません。あなたが使用したファイル名を自分で並べ替えることができsorted() function

for infile in sorted(glob.glob('*.txt')): 
    print "Current File Being Processed is: " + infile 

あなたのコード内のos.path.join呼び出しは何もしませんことに注意してください。 1つの引数だけでは何もしませんが、その引数は変更されません。

ファイルはアルファベット順に並べ替えられ、109より前に並べ替えられます。あなたは、ソートを改善するために、カスタムキーの機能を使用することができます。

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'] 
+0

HI。ソートされた関数は、残念ながら順序を変更しません。 – user1620012

+0

@ user1620012:ソート順を改善するために私の答えを更新しました。 –

+0

こんにちは..実際に私のファイルの名前は.. text-text9-text.txt、text-text10-text.txtなどです。 – user1620012

6

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 

EDIT: おそらく、このキーの機能は、あなたのファイルを並べ替えることができます。

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桁の文字列に変換され、数字が入ります。

+0

ソートされた関数は、残念なことに、順序を変更しません。 – user1620012

+0

'' blub05.txt'は 'blub10​​.txt'の前に来るので、' y/blub05.txt'は最後の位置から上に移動します。 'key_func'のディレクトリなしでファイル名だけが比較されます。 – hochl

+0

実際、私のファイルにはゼロがありません。それらはx/blub1.txt x/blub2.txt x/blub10​​.txtという名前に変更され、sortコマンドを使用した場合でも間違った順序になります。 x/blub3.txt y/blub5.txt – user1620012

-1
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 
+0

実際に私は処理したいファイルをいくつか持っています。リストを作成するのはかなり不便です。 – user1620012

0
glob.glob(os.path.join('*.txt')) 

文字列のリストを返すので、あなたは簡単にニシキヘビsorted() functionを使用してリストを並べ替えることができます。

sorted(glob.glob(os.path.join('*.txt'))) 
+0

sorted関数は同じ結果を返します。処理中の現在のファイル:file10.txt.txt 処理中の現在のファイル:file11.txt.txt 処理中の現在のファイル:file9.txt.txt – user1620012

0

あなたは、ファイル名に番号を分離することにより、数値に「ASCIIBetical」からソートを変更する必要があります。あなたはそのようにそれを行うことができます:あなたはglob.glob(「* TXT」)の結果を含むファイル名を設定することができます

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 

を。

さらに、keyFunc関数は、ファイル名に数字が含まれていることと、その番号がファイル名のみであることを前提としています。ソートする必要がある番号を分離するのに必要なだけ複雑になるように、その機能を変更することができます。

+0

異なるファイル数字でグループ化された名前ですか? Ex。 'foo1.txt'、' foo2.txt' .. 'foo10.txt'、' bar1.txt'、 'bar2.txt'など?あるいは、ファイル名に2組の数字がありますか? –

+0

@MartijnPieters:それは最初の質問の要件ではなく、私はあなたが答えを知っていると思います。 :) – grieve

+0

まあ、ほとんどの質問は、ファイルの小さなサンプルを使用します。 「9」、「10」、「11」シーケンスが重要な部分であったことが判明しました。ここに全体像があるとは思いません。 :-) –

関連する問題