我编写了下面的代码,以便能够遍历给定文件路径的所有文件、子文件夹和文件夹。然而,当我运行代码时,它一直给我文件没有发现错误。同样值得一提的是,当我在mac上运行相同的代码时,它会给我相同的错误,但是当我设置follow_symlink=False时,错误消失了。
谁能告诉我我在这里做错了什么?[输入图片描述][1]
from pathlib import Path
import csv
import os
import time
from datetime import datetime
class File:
def __init__(self, folder_path):
self.folder_path = Path(folder_path)
def folders(self):
return [folder for folder in self.folder_path.iterdir() if folder.is_dir()]
def summary(self):
errors = []
data_table = []
folders = self.folders()
for folder in folders:
total=0
count = 0
files = folder.glob('**/*')
for file in files :
try:
total+=(os.stat(file, follow_symlinks=False).st_size)
count+=1
except OSError as e:
errors.append(f'Error with file {file} in folder {folder} Error-->{e}')
lm_date = datetime.strftime(datetime.strptime(time.ctime(os.stat(folder).st_mtime),
'%a %b %d %H:%M:%S %Y'), '%d-%b-%Y')
data_table.append({'Path':folder, 'Size in MB':f'{total/1048576}', 'File Count':count,
'Last Modifed Date':lm_date})
lm_date = datetime.strftime(datetime.strptime(time.ctime(os.stat(folder).st_mtime),
'%a %b %d %H:%M:%S %Y'), '%d-%b-%Y')
data_table.append({'Path':folder, 'Size in MB':f'{total/1048576}', 'File Count':count,
'Last Modifed Date':lm_date})
return {'data':data_table, 'error':errors}
def csv_export(self, file_path):
data_list = self.summary()['data']
headers = data_list[0].keys()
with open(file_path, 'w') as fp:
writer = csv.DictWriter(fp, headers)
writer.writeheader()
try:
for data in data_list:
writer.writerow(data)
print(f'file saved to location: {os.path.join(os.getcwd(), file_path)}')
except OSError as e:
print(f'Error exporting data file {e}')
[1]: https://i.stack.imgur.com/0YxQl.jpg这是我得到的错误。
旧的DOS/Win 'subst'命令可能会有所帮助。通过这种方式,您可以将'长基路径'替换为单个'驱动器号'(加上双冒号)。
>help subst
>subst <drive2:> <drive1:><long_base_path>
但是顺便说一下:为什么不用'os.walk()'呢?这将遍历整个给定的根目录:
import os
for dirName, subDirs, fileNames in os.walk('<root_dir>'):
print('Current directory: ' + dirName)
for dir in subDirs:
print('Sub directory in ' + dirName + ': ' + dir)
for fName in fileNames:
print('File in ' + dirName + ': '+ fName)
在Windows API中(以下段落将讨论一些例外情况),路径的最大长度是MAX_PATH,定义为260个字符。本地路径的结构顺序如下:驱动器号、冒号、反斜杠、由反斜杠分隔的名称组件,以及结束的空字符。例如,驱动器D上的最大路径为"D:some 256个字符的路径字符串"。";"表示当前系统代码页的不可见终止空字符。
根据微软网站你的路径太长,确保它少于260个字符。Python的OS模块无法处理大于260个字符的路径。