4

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

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库中的错误还是实际上是什么?

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

4

2 回答 2

5

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

os.path.join()用户os.sep加入路径,但不会os.altsep在输入路径中替换。os.walk()仅用于os.path.join()构建(path, files, directories)它生成的每个元组的第一个元素

如果这让您感到困扰,请使用以下功能规范您的路径:os.path.normpath()

在 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)

或规范化输入字符串:

于 2018-11-26T12:44:41.190 回答
1

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

于 2020-12-24T02:03:28.177 回答