39

假设我在一个文件夹中有三个文件:file9.txt、file10.txt 和 file11.txt,我想按这个特定的顺序阅读它们。谁能帮我这个?

现在我正在使用代码

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代码中的调用是无操作的;只有一个参数,它什么也不做,只是原封不动地返回那个参数。

请注意,您的文件将按字母顺序排序,即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 回答