python 根据平台以不同顺序列出目录

10 投票
2 回答
7484 浏览
提问于 2025-04-16 15:45

我正在使用XPsp3系统和Python 2.7编写和测试代码。然后我把代码运行在2003服务器上,依然是Python 2.7。我的文件夹结构大概是这样的:

d:\ssptemp
d:\ssptemp\ssp9-1
d:\ssptemp\ssp9-2
d:\ssptemp\ssp9-3
d:\ssptemp\ssp9-4
d:\ssptemp\ssp10-1    
d:\ssptemp\ssp10-2
d:\ssptemp\ssp10-3
d:\ssptemp\ssp10-4

每个文件夹里都有一个或多个文件,文件名里会包含“IWPCPatch”这个词。

在这些文件中的一个(每个文件夹里都有一个这样的文件)里,会有一行内容是'IWPCPatchFinal_a.wsf'。

我做的事情是:

1) 在d:\ssptemp下的所有文件夹里使用os.walk这个功能。

2) 找到所有文件名里包含'IWPCPatch'的文件。

3) 检查这些文件的内容,看里面是否有'IWPCPatchFinal_a.wsf'。

4) 如果文件内容符合条件,我就把这个文件的路径添加到一个列表里。

我的问题是,在我的XP机器上,这一切都运行得很好。如果我打印出列表的结果,我能看到几个项目,顺序和我上面列的一样。

但是当我把代码移到2003服务器上时,结果的顺序就变了。它先显示的是ssp10-X,然后是ssp9-X。这导致我在程序的其他部分遇到了问题。

从我的输出结果来看,os.walk的开始顺序是错的,但我不知道为什么会这样。

import os
import fileinput

print "--createChain--"

listOfFiles = []
for path, dirs, files in os.walk('d:\ssptemp'):

    print "parsing dir(s)"
    for file in files:
        newFile = os.path.join(path,file)
        if newFile.find('IWPCPatch') >= 0:
            for line in fileinput.FileInput(newFile):
                if "IWPCPatchFinal_a.wsf" in line:
                    listOfFiles.append(newFile)                            
                    print "Added", newFile

for item in listOfFiles:
    print "list item", item

2 个回答

14

在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这种情况下,我们需要去查找问题的原因。通常,我们可以通过查看错误信息、调试代码或查阅相关文档来找到解决办法。

另外,和其他程序员交流也是一个很好的方法。我们可以在一些技术论坛或者问答网站上提问,描述我们遇到的问题,看看有没有人遇到过类似的情况并找到了解决方案。

总之,遇到问题时,不要着急,慢慢分析,寻找解决的办法,通常都会找到答案的。

for path, dirs, files in os.walk('d:\ssptemp'):

    # sort dirs and files
    dirs.sort()
    files.sort()

    print "parsing dir(s)"
    # ...
13

在使用 os.walk 时,文件夹的顺序不一定是按字母顺序排列的(我觉得这其实是跟它们在文件系统中的存储方式有关)。如果你在同一个目录下(在同一个文件系统上)不改变目录里的内容,重复调用这个函数时返回的顺序可能会是一样的,但这个顺序不一定是按字母排列的。

如果你想要一个有序的文件名列表,你就需要自己先把列表建立起来,然后再进行排序。

撰写回答