【问题标题】:Incorrect file reading when using os.walk in python3在 python3 中使用 os.walk 时文件读取不正确
【发布时间】:2016-11-07 18:06:33
【问题描述】:

我正在使用os.walk() 方法浏览文件夹。在其中一个文件夹中,有大量文件,大约有 100,000 个。这些文件看起来像:p_123_456.zip。但它们被读作p123456.zip。事实上,当我打开 Windows 资源管理器浏览文件夹时,前几秒钟文件看起来像 p123456.zip,但随后将它们的外观更改为 p_123_456.zip。这是一个奇怪的场景。

现在,我不能使用time.sleep(),因为所有文件夹和文件都被读入循环行中的python 变量。这是代码的sn-p:

    for root, dirs, files in os.walk(srcFolder):
        os.chdir(root)
        for file in files:
            shutil.copy(file, storeFolder)

在最后一行,我得到一个文件未找到异常,说文件p123456.zip 不存在。有没有人遇到过这个神秘的问题?无论如何绕过这个?这是什么原因?谢谢。

【问题讨论】:

  • 这有什么不妥之处?尝试打开文件时是否遇到异常?如果是这样,异常和回溯是什么?还是您只是假设 Python 会提取错误的名称?文件夹中是否有可能同时包含p_123_456.zipp123456.zip,Windows 资源管理器只需要一些时间来对文件名进行排序以进行显示?
  • 我想将文件移动到其他文件夹。因此,当读取名称时,它没有'_'。但是当我调用移动操作时,它说这样的文件不存在。
  • 移动文件时是否提供源文件的完整路径? source_full_path = os.path.join(root, fname)
  • 请添加您实际尝试打开/重命名文件的行。
  • @StevenRumbalski:是的,我在此基础上重新打开了。也就是说,如果srcFolderstoreFolder 是相对路径,os.chdir 会破坏; os.walk 在这种情况下依赖于一致的工作目录,根据 the docs:“注意:如果您传递相对路径名,请不要在 walk() 的恢复之间更改当前工作目录。walk() 永远不会更改当前目录,并假设它的调用者也没有。”此代码违反了该假设。

标签: python python-3.x os.walk file-not-found


【解决方案1】:

您似乎没有将实际文件夹名称与文件名连接起来。尝试将您的代码更改为:

for root, dirs, files in os.walk(srcFolder):
    for file in files:
        shutil.copy(os.path.join(root, file), storeFolder)

os.chdir 应该像瘟疫一样被避免。一方面 - 如果更改成功,它将不再是您运行 os.walk 的目录 - 然后,另一个文件夹上的第二个 chdir 将失败(停止您的 porgram 或将您更改为意外文件夹)。

只需将文件夹名称添加为前缀,不要尝试使用 chdir。

此外,至于上面 ShadowRanger 的评论,os.walk 如果您在其迭代中 chdir - https://docs.python.org/3/library/os.html#os.walk 会正式中断 - 这可能是您遇到问题的根源。

【讨论】:

    猜你喜欢
    • 2018-10-18
    • 2021-06-13
    • 2015-10-08
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    相关资源
    最近更新 更多