【发布时间】:2020-12-06 10:47:21
【问题描述】:
我正在尝试迭代地打开一些文件以对数据进行一些处理。但是,我无法使其工作。我不知道是什么原因造成的。
sd = os.path.dirname(os.path.abspath(__file__))
file_names = []
for root,d_names,f_names in os.walk(os.path.join(sd, path)):
for f in f_names:
if f.endswith('.csv'):
file_names.append(os.path.join(root, f))
for f_name in file_names:
with open(f_name, 'r') as file:
...
我也尝试了以下方法,使用pathlib
input_path = pathlib.Path(path)
file_names = input_path.glob('**/*.csv')
for f_name in file_names:
with open(f_name.resolve(), 'r') as file:
...
两种方法产生相同的结果。
'path' 是与脚本位于同一目录的目录的名称。读取错误似乎表明路径是正确的。这些文件位于一个有些复杂的文件结构中,有时文件名很长。
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\...
为了更深入地了解,这里是path文件结构的简要简化表示
path
¦-dir1
¦¦-dir2
¦¦¦-dir3
¦¦¦¦-sub1
¦¦¦¦¦-file-1a
¦¦¦¦-sub2
¦¦¦¦¦-file-1b
¦¦¦¦¦-file-2b
我通过测试发现,当我将path 替换为dir3 以删除不必要的遍历时,脚本将处理该目录中唯一的file-1a 和file-1b,但给出到达file-2b 时出现同样的错误。此外,当将sub2 设置为目标时,它将毫无问题地处理sub2 内的所有文件。
另外,按照建议,我尝试在尝试打开文件之前添加行 print(os.access(f_name, os.R_OK), repr(f_name))。事实证明,每次在引发错误之前它都会返回False(后跟文件路径),并在我设法处理文件时返回True。
【问题讨论】:
-
你为什么不使用pathlib。使用
pathlib,您可以使用Path(path).glob('*.csv') -
脚本目录不一定与 cwd 相同。像这样获取脚本目录:
sd = os.path.dirname(os.path.abspath(__file__))。然后做os.walk(os.path.join(sd, path))。打开文件时无需再次加入路径,因为它们应该已经是绝对的。 -
@deadshot 谢谢,我喜欢这个实现。不幸的是,它似乎无法修复错误。
-
您在使用
pathlib时遇到了什么错误 -
@ABenju 出于向后兼容的原因,Windows 使用的最大路径长度为 260 个字符。这就是我要求您显示文件名的
repr的部分原因。当被要求调试输出时,请始终在您的问题中显示完整的结果。有关此问题的更多信息以及一些可能的解决方法,请参阅 this question。