Python - 我可以(或应该)更改os.path.sep吗?

Chr*_*ris 8 python

我正在编写一个脚本来解析多个日志文件并维护已处理的文件列表.当我读取要处理的文件列表时,我使用os.walk并获得类似于以下内容的名称:

C:/Users/Python/Documents/Logs\ServerUI04\SystemOut_13.01.01_20.22.25.log
Run Code Online (Sandbox Code Playgroud)

这是由以下代码创建的:

filesToProcess.extend(os.path.join(root, filename) for filename in filenames if logFilePatternMatch.match(filename))
Run Code Online (Sandbox Code Playgroud)

似乎"root"使用正斜杠作为分隔符(我在Windows上找到更方便),但"filename"使用反斜杠,所以我最终得到一个不一致的文件路径,因为它包含前向和后斜杠的混合作为分隔符.

我试过设置分隔符:

os.path.sep = "/"
Run Code Online (Sandbox Code Playgroud)

os.sep = "/"
Run Code Online (Sandbox Code Playgroud)

在.join之前,它似乎没有任何效果.我意识到理论上我可以操作字符串,但从长远来看,我希望我的脚本可以在Unix和Windows上运行,所以如果可能的话,它会更喜欢它是动态的.

我错过了什么吗?

更新:

基于下面的有用响应,看起来我的问题是自己造成的,为方便起见,我设置了以root身份使用的初始路径,如下所示:

logFileFolder = ['C:/Users/Python/Documents/Logs']
Run Code Online (Sandbox Code Playgroud)

当我把它更改为:

logFileFolder = ['C:\\Users\\Python\\Documents\\Logs']
Run Code Online (Sandbox Code Playgroud)

一切正常,我生成的文件路径全部使用"\".看起来我的方法是错误的,因为我试图让Python改变行为而不是纠正我设置的值.

谢谢!

Ant*_*hon 8

我会把手指放在os.sep上并使用os.path.normpath()来组合root和文件名:

filesToProcess.extend(os.path.normpath(os.path.join(root, filename)) 
            for filename in filenames if logFilePatternMatch.match(filename))    
Run Code Online (Sandbox Code Playgroud)


Tom*_*and 6

我更喜欢以下效用函数。

from os.path import sep, join

def pjoin(*args, **kwargs):
  return join(*args, **kwargs).replace(sep, '/')
Run Code Online (Sandbox Code Playgroud)

它将两种变体(linux 风格和 windows 风格)转换为 linux 风格。windows和linux都支持python中的'/'分隔符。

我拒绝了简单的os.sep.join(['str','str','str'])因为它没有考虑现有的分隔符。以 sep.join 与 vanilla join 为例:

In[79]: os.sep.join(['/existing/my/', 'short', 'path'])
Out[79]: '/existing/my/\\short\\path'
In[80]: os.path.join('/existing/my/', 'short', 'path')
Out[80]: '/existing/my/short\\path'
Run Code Online (Sandbox Code Playgroud)

可以使用以下建议修复香草连接:

In[75]: os.path.normpath(os.path.join('/existing/my/', 'short', 'path'))
Out[75]: '\\existing\\my\\short\\path'
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好。但是接下来我们将介绍以下场景,我们将从 Windows 与 linux 进行交互。

local_path = os.path.normpath(os.path.join('C:\\local\\base', 'subdir', 'filename.txt'))
remote_path = os.path.normpath(os.path.join('/remote/base', 'subdir', 'filename.txt'))
sftp_server.upload(local_path, remote_path)
Run Code Online (Sandbox Code Playgroud)

以上将失败,因为 sftp 服务器需要一个“/”分隔符,而 os.path.normpath 将在 Windows 上规范化为“\”。

通过使用 pjoin 实用程序功能或类似功能,它可以跨操作系统、网络、ftp 等工作。