我正在编写一个脚本来解析多个日志文件并维护已处理的文件列表.当我读取要处理的文件列表时,我使用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改变行为而不是纠正我设置的值.
谢谢!
我会把手指放在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)
我更喜欢以下效用函数。
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 等工作。
| 归档时间: |
|
| 查看次数: |
7219 次 |
| 最近记录: |