我正在编写一个脚本来解析多个日志文件并维护已处理的文件列表。当我读取要处理的文件列表时,我使用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改变行为,而不是纠正我设置的值。
谢谢!
答案 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.sep
和os.path.sep
,因为它们不是os.path.join
正在使用的内容。您可以按照Anthon的建议使用os.path.normpath
。另一种方法是拥有自己的简单路径连接:
os.sep.join([i1,i2,i3])