【问题标题】:Python: os.path.isfile does't detect the filePython:os.path.isfile 没有检测到文件
【发布时间】:2019-02-12 16:05:45
【问题描述】:

我有一个脚本,它通过检查每个需要的文件是否存在来更新文件层次结构,如果不存在则下载它们。

因为使用完整路径会导致我认为文件名太长且通常包含特殊字符的问题,我已将其更改为 os.chdir 到每个子目录中,检查所需文件并下载它们。

但是我的程序总是在一个文件上崩溃,因为 os.path.isfile 出于某种原因说它不存在(即使它确实存在)。真正令人困惑的部分是当它尝试使用with open(path, "wb") as f: 下载它并运行到FileNotFoundError,即使它以写入模式打开。

如果路径链接到一个不存在的目录但在我的情况下它没有链接到任何目录,那么当您尝试open 时,您似乎可以获得FileNotFoundError

我尝试在文件名上使用os.path.split,以防它以某种方式包含斜杠或反斜杠,但文件名似乎没问题。

这里是代码。这个问题不在它遇到的第一个目录上,它在遇到这个之前设法解决了至少十几个。

stepOut = 1
paths = list(map(unquote, url.split("/")[6:]))
for index, path in enumerate(paths):
    if index != len(paths) - 1:
        if not os.path.isdir(path):
            os.mkdir(path)
        os.chdir(path)
        stepOut += 1
    else:
        if not os.path.isfile(path):
            r = requests.get(url, stream=True)
            if r.status_code == 200:
                print("Saving", path)
                with open(path, 'wb') as f:
                    r.raw.decode_content = True
                    shutil.copyfileobj(r.raw, f)
            else:
                print("Error getting:", url)
        else:
            print("Skipping", paths)
os.chdir("..\\" * stepOut)

【问题讨论】:

  • 如果可能的话,你能把代码贴出来吗?
  • 我尝试解决的另一个技巧是将文件下载为“temp”,然后将其重命名为正确的名称,但我仍然遇到完全相同的问题。
  • 刚刚检查了文件名是否太长但它的长度为 91 个字符,并且脚本在遇到此问题之前管理超过 110 个字符的文件。

标签: python windows file-io operating-system


【解决方案1】:

原来这是我最初的怀疑,文件名实际上太长了。

基本文件名不是最长的,但文件名的完整路径(包括根目录的每个子目录)太长了。

问题已通过将整个项目移至根目录来解决。

有趣的是,您可以在窗口资源管理器中创建文件名过长的文件结构,但如果您甚至尝试使用 python 简单地检测那里是否有文件,您就会遇到问题。

【讨论】:

  • 在启用了长路径的 Windows 10 上运行的 Python 3.6+ 中,我们可以使用最多约 32760 个字符的路径,而无需任何额外处理。否则,对于缺少隐式长路径支持的旧版 Python 或 Windows,我们必须在完全限定路径前加上 "\\\\?\\"。如果是 UNC 路径(例如 "\\\\server\\share\\file"),请将其重写为使用“UNC”设备(例如 "\\\\?\\UNC\server\share\file")。此外,对于 Python 2,我们必须使用 unicode 字符串。
猜你喜欢
  • 2014-01-27
  • 2015-05-24
  • 1970-01-01
  • 2014-03-12
  • 2016-04-14
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 2021-05-26
相关资源
最近更新 更多