python os.walk 显示混合窗口和unix路径

smo*_*yna 6 python windows path-separator python-os

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

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

我的问题是关于 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
Run Code Online (Sandbox Code Playgroud)

给出的开始文件夹是:

D:/JAJA/Projects/DAF/AIM/WEBAPP/trunk/src/main/java/ie/gov/agriculture/aim
Run Code Online (Sandbox Code Playgroud)

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

而 os.walk 函数找到的所有后续子文件夹都带有 Windows 斜杠:"\"

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

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

Mar*_*ers 6

这里没有实际问题。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)
Run Code Online (Sandbox Code Playgroud)

或标准化循环中生成的路径:

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)
Run Code Online (Sandbox Code Playgroud)

或规范化输入字符串: