【问题标题】:python os.walk displays mixed windows and unix pathspython os.walk 显示混合的 windows 和 unix 路径
【发布时间】:2019-04-28 02:36:01
【问题描述】:

我正在尝试识别文件夹中具有特定名称的所有文件。我正在使用标准代码来执行此操作,如下所示:

for paths, subdirs, files in os.walk(start_dir, topdown=True):
    for file in files:
        print(os.path.join(paths, file))

我的问题是关于这段代码在windows机器上的输出,基本上路径的动态部分有错误的斜杠符号:

D:/JAJA/Projects/DAF/AIM/WEBAPP/trunk/src/main/java/ie/gov/agriculture/aim\aes\AesSheetNumberEntity.java
D:/JAJA/Projects/DAF/AIM/WEBAPP/trunk/src/main/java/ie/gov/agriculture/aim\aes\DocumentReceivedDetailEntity.java
D:/JAJA/Projects/DAF/AIM/WEBAPP/trunk/src/main/java/ie/gov/agriculture/aim\aes\DocumentReceivedEntity.java
D:/JAJA/Projects/DAF/AIM/WEBAPP/trunk/src/main/java/ie/gov/agriculture/aim\aes\DocumentTypeEntity.java

给出的起始文件夹是:

D:/JAJA/Projects/DAF/AIM/WEBAPP/trunk/src/main/java/ie/gov/agriculture/aim

文件夹分隔符是unix one:"/"

虽然 os.walk 函数找到的所有后续子文件夹都有斜线:"\"

所以最后我有无法立即使用的无效路径。这是python os库中的错误还是实际上是什么?

目前我可以很容易地用正确的分隔符替换错误的分隔符,但我想知道这是否是唯一的方法?

【问题讨论】:

  • 我以为 Python 标准是 os.sep.join(sequence_to_join) ?我猜这里使用os.path 可能是导致您的问题的原因
  • 路径实际上并没有错,它们可以与斜杠混合使用。两者都是有效的。 Windows 有 两个 路径分隔符,混合使用也没关系。
  • 如果您想将路径标准化为单个分​​隔符,请使用 os.path.normpath() 明确执行此操作
  • 您的示例似乎混淆了:路径以D:JAJA 开头(没有斜线),这真的是您得到的吗?
  • @Joël:假设这是一个简单的“匿名化堆栈溢出发布的字符串”编辑错误。我添加了斜线。

标签: python windows python-os path-separator


【解决方案1】:

这里没有实际问题。 Windows 支持两个路径分隔符;正斜杠和反斜杠均有效且受支持,即使混合使用也是如此。一个是os.sep (\),另一个是os.altsep 字符(/)。

os.path.join() 用户 os.sep 加入路径,但不会替换输入路径中的 os.altsepos.walk() 只是使用 os.path.join() 来构建它生成的每个 (path, files, directories) 元组的第一个元素

如果这让您感到困扰,规范化您的路径,使用 os.path.normpath() function:

在 Windows 上,它将正斜杠转换为反斜杠。

所以规范化传递给os.walk()的路径:

for paths, subdirs, files in os.walk(os.path.normpath(start_dir), topdown=True):
    for file in files:
        full_path = os.path.join(paths, file)
        print(full_path)

或者对循环中生成的路径进行归一化:

for paths, subdirs, files in os.walk(start_dir, topdown=True):
    for file in files:
        full_path = os.path.join(paths, file)
        normalised = os.path.normpath(full_path)
        print(normalised)

或规范化输入字符串:

【讨论】:

  • 它确实困扰我,路径是混合的,因为当你尝试使用这样的路径创建一个新文件时它会失败,但是你的回答填补了账单
  • @smoczyna:不,使用混合正斜杠和反斜杠的路径创建一个新文件不会失败,其他一切都相同(即,如果可以创建只有正斜杠或只有反斜杠的路径,那么它也可以用混合斜线创建。
  • 我在尝试时出现权限被拒绝错误。这显然不是真的,因为我只在我的主文件夹中操作。
  • @smoczyna:现在用os.path.normpath() 再试一次。 你会得到同样的异常
  • 你说得对,那是我的错,不是路径,谢谢
【解决方案2】:

使用os.path.join(path).replace("\\","/")os.path.normpath().replace("\\","/") 会将路径转换为所有正斜杠'/'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 2023-03-13
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    相关资源
    最近更新 更多