11

我正在编写一个脚本来解析多个日志文件并维护已处理文件的列表。当我阅读要处理的文件列表时,我使用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 上并发现更方便),但“文件名”使用反斜杠,所以我最终得到的文件路径不一致,因为它包含正斜杠和反斜杠的混合作为分隔符。

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

os.path.sep = "/"

os.sep = "/"

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

我错过了什么吗?

更新:

根据下面的有用回复,我的问题似乎是自己造成的,为方便起见,我设置了用作 root 的初始路径,如下所示:

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

当我将其更改为:

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

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

谢谢!

4

4 回答 4

8

我会把手指从 os.sep 上移开,并在结合根和文件名的结果上使用 os.path.normpath():

filesToProcess.extend(os.path.normpath(os.path.join(root, filename)) 
            for filename in filenames if logFilePatternMatch.match(filename))    
于 2013-04-03T17:06:06.457 回答
6

我更喜欢以下实用功能。

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 实用程序功能或类似功能,它可以跨操作系统、Web、ftp 等工作。

于 2016-05-26T08:38:50.923 回答
4

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

于 2013-08-20T08:17:13.347 回答
1

你最好不要触摸os.sepos.path.sep因为它们不是os.path.join正在使用的东西。您可以os.path.normpath按照 Anthon 的建议使用。另一种选择是拥有自己的简单路径连接:

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

于 2013-04-03T17:20:08.773 回答