python os.walk显示混合的windows和unix路径

python os.walk显示混合的windows和unix路径,python,windows,python-os,path-separator,Python,Windows,Python Os,Path Separator,我正在尝试识别文件夹中具有特定名称的所有文件。我使用的是标准代码,如下所示: 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/s

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

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函数找到的所有后续子文件夹都使用windows斜杠:
“\”

因此,在最后我有无效的路径,不能直接使用。这是python os库中的一个bug还是什么


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

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

os.path.join()
user
os.sep
加入路径,但不会替换输入路径中的
os.altsep
os.walk()
只使用
os.path.join()
构建它生成的每个
(路径、文件、目录)
元组的第一个元素

如果这让您感到困扰,请使用以下命令使路径正常化:

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

因此,将传递到
os.walk()
的路径正常化:

或使循环中生成的路径正常化:

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)

或者规范化输入字符串:

使用
os.path.join(path)。替换(“\\”、“/”)
os.path.normpath()。替换(“\\”、“/”)
将路径转换为所有正斜杠“
/

我以为Python标准是
os.sep.join(sequence\u to\u join)
?我猜这里使用的
os.path
可能是导致您出现问题的原因路径实际上并不是错误的,它们将与斜杠混合使用。两者都是有效的。Windows有两个路径分隔符,如果将它们混合使用并不重要。如果要将路径标准化为单个分隔符,请使用
os.path.normpath()
显式执行此操作。您的示例似乎混淆了:路径以
D:JAJA
开头(无斜杠),这真的是你得到的吗?@Joël:假设这是一个简单的“匿名化堆栈溢出发布字符串”编辑错误。我又添加了斜杠。路径是混合的,这让我很烦恼,因为当你尝试用这样的路径创建一个新文件时,它会失败,但是你的答案会填充整个路径bill@smoczyna:否,在其他条件相同的情况下,使用混合正向和反向斜杠的路径创建新文件不会失败(也就是说,如果只能创建只有正向斜杠或反向斜杠的路径,则可以使用混合斜杠0来创建该路径。我尝试时出现了权限拒绝错误。这显然不是真的,因为我只在主文件夹中操作。@smoczyna:现在请使用
os.path.normpath()再试一次。@smoczyna:
。你也会遇到同样的异常。你说得对,那是我的错,不是路径,谢谢
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)