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

时间:2013-04-03 17:00:06

标签: python

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

C:/Users/Python/Documents/Logs\ServerUI04\SystemOut_13.01.01_20.22.25.log

这是由以下代码创建的:

filesToProcess.extend(os.path.join(root, filename) for filename in filenames if logFilePatternMatch.match(filename))

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

我尝试使用以下方法设置分隔符:

os.path.sep = "/"

os.sep = "/"

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

我错过了什么吗?

更新

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

logFileFolder = ['C:/Users/Python/Documents/Logs']

当我把它更改为:

logFileFolder = ['C:\\Users\\Python\\Documents\\Logs']

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

谢谢!

4 个答案:

答案 0 :(得分:7)

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

filesToProcess.extend(os.path.normpath(os.path.join(root, filename)) 
            for filename in filenames if logFilePatternMatch.match(filename))    

答案 1 :(得分:4)

我使用'/'.join([path1, path2])来解决这个问题,因为'/'在windows和linux中运行良好。

答案 2 :(得分:2)

我更喜欢以下实用功能。

from os.path import sep, join

def pjoin(*args, **kwargs):
  return join(*args, **kwargs).replace(sep, '/')

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

我拒绝了简单的 os.sep.join(['str','str','str']),因为它没有考虑现有的分隔符。使用sep.join vs 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'

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

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

到目前为止一切顺利。但接下来我们将介绍以下场景,我们将从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)

上面的内容将失败,因为sftp服务器需要一个'/'分隔符,而os.path.normpath将在windows上标准化为'\'。

通过使用pjoin实用程序功能或类似功能,它可以跨OS,web,ftp等工作。

答案 3 :(得分:1)

最好不要触及os.sepos.path.sep,因为它们不是os.path.join正在使用的内容。您可以按照Anthon的建议使用os.path.normpath。另一种方法是拥有自己的简单路径连接:

os.sep.join([i1,i2,i3])