Python os.walk возвращает меньше файлов, чем C # Directory.GetFiles - PullRequest
0 голосов
/ 25 января 2019

Почему os.walk в python возвращает меньше файлов, чем при использовании 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 # и, возможно, должен быть счастлив, но я хотел бы понять, почему между этими двумя результатами существует расхождение.

1 Ответ

0 голосов
/ 25 января 2019

Недостаточно репутации для комментариев, но есть вероятность, что при использовании os.walk существует проблема с файлами, которая не позволяет методу фактически прочитать файл. Из документации

"По умолчанию ошибки из вызова scandir () игнорируются. Если указан необязательный аргумент onerror, это должна быть функция; она будет вызываться с одним аргументом, экземпляром OSError. Она может сообщить об ошибке продолжить обход или вызвать исключение, чтобы прервать обход. Обратите внимание, что имя файла доступно в качестве атрибута имени объекта исключения. "

Попробуйте использовать что-то вроде этого:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...