7

我正在尝试编写一个 python 工具来读取日志文件并对其进行处理

它应该做的一件事是使用日志文件中列出的路径(它是备份工具的日志文件)

/Volumes/Live_Jobs/Live_Jobs/*SCANS\ and\ LE\ Docs/_LE_PROOFS_DOCS/JEM_lj/JEM/0002_OXO_CorkScrew/3\ Delivery/GG_Double\ Lever\ Waiters\ Corkscrew_072613_Mike_RETOUCHED/gg_3110200_2_V3_Final.tif

不幸的是,我提供的路径没有适当地转义,我在 python 中正确转义时遇到了麻烦。也许 python 不是最好的工具,但我喜欢它的灵活性——它可以让我扩展我写的任何东西

使用正则表达式转义函数会转义太多字符,管道.quote 方法不会转义空格,如果我使用正则表达式将 ' ' 替换为 '\ ' 我最终会得到

/Volumes/Live_Jobs/Live_Jobs/*SCANS\\ and\\ LE\\ Docs/_LE_PROOFS_DOCS/JEM_lj/JEM/0002_OXO_CorkScrew/3\\ Delivery/GG_Double\\ Lever\\ Waiters\\ Corkscrew_072613_Mike_RETOUCHED/gg_3110200_2_V3_Final.tif

它们是双重转义的,不会传递给像os.path.getsize().

我究竟做错了什么??

4

2 回答 2

7

如果您正在从文件中读取路径,并将它们传递给类似的函数os.path.getsize,则无需转义它们。例如:

>>> with open('name with spaces', 'w') as f:
...     f.write('abc\n')
>>> os.path.getsize('name with spaces')
4

实际上,Python 中只有少数函数需要转义空格,因为它们将字符串传递给 shell(例如os.system),或者因为它们试图代表您进行类似 shell 的解析(subprocess.foo例如arg 字符串而不是 arg 列表)。


所以,假设logfile.txt看起来像这样:

/Volumes/My Drive/My Scans/Batch 1/foo bar.tif
/Volumes/My Drive/My Scans/Batch 1/spam eggs.tif
/Volumes/My Drive/My Scans/Batch 2/another long name.tif

......然后这样的事情会正常工作:

with open('logfile.txt') as logf:
    for line in logf:
        with open(line.rstrip()) as f:
            do_something_with_tiff_file(f)

注意您示例中的这些*字符,如果这些是全局模式,那也很好:

with open('logfile.txt') as logf:
    for line in logf:
        for path in glob.glob(line.rstrip()):
            with open(path) as f:
                do_something_with_tiff_file(f)

如果您的问题与您所描述的完全相反,并且文件中充满了转义的字符串,并且您想要取消转义它们,decode('string_escape')将撤消 Python 样式的转义,并且有不同的函数可以撤消不同类型的转义,但是在不知道要撤消哪种转义的情况下,很难说您想要哪种功能……</p>

于 2013-08-08T22:23:01.557 回答
4

尝试这个:

  myfile = open(r'c:\tmp\junkpythonfile','w')

'r' 代表原始字符串。

你也可以使用\喜欢

myfile = open('c:\\tmp\\junkpythonfile','w')
于 2013-08-08T22:03:00.040 回答