【问题标题】:FileNotFoundError when opening a file with absoulute path [duplicate]打开具有绝对路径的文件时出现 FileNotFoundError [重复]
【发布时间】: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-1afile-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

标签: python file directory


【解决方案1】:

非常感谢@ekhumoro 为我指明了正确的方向。

我的路径似乎超过了 260 个字符,出于向后兼容的原因,默认情况下 Windows 不允许这样做。

我更改了 Windows 注册表以允许长路径,现在我的脚本在访问结构中的所有文件时没有问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 2011-01-11
    • 2016-08-03
    • 1970-01-01
    相关资源
    最近更新 更多