首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对os.listdir文件排序

对os.listdir文件排序
EN

Stack Overflow用户
提问于 2014-02-20 05:01:42
回答 3查看 9.5K关注 0票数 3

如果已下载了几年来以下列命名约定存储在文件中的数据,则为year_day.dat。例如,名为2014_1.dat的文件拥有2014年1月1日的数据。我需要阅读这些按日排序的数据文件,2014_1.dat,2014_2.dat,2014_3.dat,直到年底。在文件夹中,它们是按顺序列出的,但是当我在目录中创建文件列表时,它们被重新排序为2014_1.dat、2014_10.dat、2014_100.dat、2014_101.dat...2014.199.dat、2014_2.dat。我认为我需要使用排序函数,但是如何强制它在白天对列出的文件进行排序,这样我就可以继续处理它们了?以下是目前为止的代码:

代码语言:javascript
复制
import sys, os, gzip, fileinput, collections
# Set the input/output directories
wrkDir = "C:/LJBTemp"
inDir = wrkDir + "/Input"
outDir = wrkDir + "/Output"
# here we go
inList = os.listdir(inDir)  # List all the files in the 'Input' directory
print inList  #print to screen reveals 2014_1.dat.gz followed by 2014_10.dat.gz NOT    2014_2.dat.gz HELP
d = {}
for fileName in inList:     # Step through each input file 
    readFileName = inDir + "/" + fileName

    with gzip.open(readFileName, 'r') as f: #call built in utility to unzip file for reading
      for line in f:
          city, long, lat, elev, temp = line.split() #create dictionary
          d.setdefault(city, []).append(temp) #populate dictionary with city and associated temp data from each input file
          collections.OrderedDict(sorted(d.items(), key=lambda d: d[0])) # QUESTION? why doesn't this work
          #now collect and write to output file
outFileName = outDir + "/" + "1981_maxT.dat" #create output file in output directory with .dat extension
with open(outFileName, 'w') as f:
     for city, values in d.items():
        f.write('{} {}\n'.format(city, ' '.join(values)))

print "All done!!"
raw_input("Press <enter>") # this keeps the window open until you press "enter"
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-20 07:32:13

如果您不介意使用第三方库,您可以使用纳蒂库,它正是针对这种情况而设计的。

代码语言:javascript
复制
import natsort
inList = natsort.natsorted(os.listdir(inDir))

这应该处理所有的数字排序,而不必担心细节。

还可以使用ns.PATH选项使排序算法路径感知:

代码语言:javascript
复制
from natsort import natsorted, ns
inList = natsorted(os.listdir(inDir), alg=ns.PATH)

完全公开,我是natsort的作者。

票数 2
EN

Stack Overflow用户

发布于 2014-02-20 05:18:20

如果您的所有文件都以‘2014_’开头,请尝试这样做:

代码语言:javascript
复制
sorted(inList, key = lambda k: int(k.split('_')[1].split('.')[0]))

否则,利用元组比较,先按年份排序,然后再按文件名的第二部分进行排序。

代码语言:javascript
复制
sorted(inList, key = lambda k: (int(k.split('_')[0]), int(k.split('_')[1].split('.')[0])))
票数 0
EN

Stack Overflow用户

发布于 2014-02-20 05:18:27

dict.items返回(key, item)对的列表。

关键函数仅使用第一个元素(d[0] => key => city)。

还有另一个问题:sorted返回排序列表的新副本,而不对列表进行内部排序。此外,OrderedDict对象是创建的,而不是在任何地方分配的;实际上,每次将项追加到列表中时,您都不需要对其排序。

移除... sorted ...行,并替换以下行:

代码语言:javascript
复制
with open(outFileName, 'w') as f:
     for city, values in d.items():
        f.write('{} {}\n'.format(city, ' '.join(values)))

用以下方法可以解决你的问题:

代码语言:javascript
复制
with open(outFileName, 'w') as f:
     for city, values in d.items():
        values.sort(key=lambda fn: map(int, os.path.splitext(fn)[0].split('_')))
        f.write('{} {}\n'.format(city, ' '.join(values)))

顺便说一句,不要手动连接硬编码的分隔符/,而是使用os.path.join

代码语言:javascript
复制
inDir + "/" + fileName

 =>

os.path.join(inDir, fileName)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21898560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档