为什么python的os.walk返回的文件少于使用C#Directory.GetFiles的文件?使用相同的起始目录时,我希望得到相同的结果。
我的Python代码是:
import os
#Note that startdir is entered as 'Z:\directoryname', same as c# below
startdir = input("Enter Starting Path: ")
fileList = []
for(dirname, dirs, files) in os.walk(startdir, followlinks=True):
for filename in files:
thefile = os.path.join(dirname,filename)
fileList.append(thefile)
printline = 'Total: ' + str(len(fileList))
print(printline)
C#很简单:
using System.IO;
...
string rootPath = @"Z:\directoryname";
string[] dirReturn = Directory.GetFiles(rootPath, "*", SearchOption.AllDirectories);
但是,Python返回数组中的653231个文件,而C#返回653271(相差40)。
我已经在C#数组中检查了重复项,但没有发现重复项。我已经比较了两个数组,并发现C#数组中Python数组中缺少的文件。 C#文件都有效。
我承认我似乎从C#代码中获得了有效的结果,也许应该很高兴,但我想了解为什么两个结果之间存在差异。
答案 0 :(得分:1)
信誉不足以进行评论,但是使用os.walk时文件可能存在问题,这会阻止该方法实际读取文件。 From the documentation
“默认情况下,将忽略scandir()调用中的错误。如果指定了可选参数onerror,则它应该是一个函数;它将被一个参数(一个OSError实例)调用。它可以报告错误继续进行遍历,或引发异常以终止遍历。请注意,文件名可用作异常对象的filename属性。”
尝试使用类似这样的内容:
import os
def error_os_walk(exception):
print("Error in file, python can't read")
startdir = input("Enter Starting Path: ")
fileList = []
for(dirname, dirs, files) in os.walk(startdir, followlinks=True, onerror=error_os_walk):
for filename in files:
thefile = os.path.join(dirname,filename)
fileList.append(thefile)
printline = 'Total: ' + str(len(fileList))
print(printline)