web-dev-qa-db-ja.com

pythonで特定の順序でファイルを読み取る

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

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

28
user1620012

ファイルシステム上のファイルはソートされません。 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']
62
Martijn Pieters

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桁の数字を含む文字列に変換されます。

8
hochl
glob.glob(os.path.join( '*.txt'))

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

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

ファイル名の番号を分離することにより、ソートを「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関数は、ファイル名に数字が含まれており、数字はファイル名のみにあると想定しています。その関数を、ソートする必要のある数を分離するのに必要なだけ複雑になるように変更できます。

0
grieve