Python 文件路径中的转义空间

Python 文件路径中的转义空间,python,regex,Python,Regex,我正在尝试编写一个python工具,它将读取日志文件并对其进行处理 它应该做的一件事是使用日志文件中列出的路径(它是备份工具的日志文件) 不幸的是,提供给我的路径没有正确转义,我在python中正确转义时遇到了困难。也许python不是实现这一点的最佳工具,但我喜欢它的灵活性——它允许我扩展我编写的任何东西 使用正则表达式转义函数转义过多的字符,pipes.quote方法不会转义空格,如果使用正则表达式将“”替换为“\”,则最终会得到 /Volumes/Live_Jobs/Live_Jobs/*

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

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

不幸的是,提供给我的路径没有正确转义,我在python中正确转义时遇到了困难。也许python不是实现这一点的最佳工具,但我喜欢它的灵活性——它允许我扩展我编写的任何东西

使用正则表达式转义函数转义过多的字符,pipes.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
它们是双转义的,不会传递给python函数,如
os.path.getsize()

我做错了什么???

试试这个:

  myfile = open(r'c:\tmp\junkpythonfile','w')
“r”代表原始字符串

您也可以使用\like

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

如果从文件中读取路径,并将其传递给诸如
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样式的转义,并且有不同的函数来撤消不同类型的转义,但是如果不知道要撤消哪种类型的转义,就很难说要使用哪种函数…

您真的需要转义路径吗?有些工具不需要逃逸;这样做的通常被认为是不安全的。您需要对路径做什么?可以尝试在字符串值前面放置一个
r
?这样,Python将把整个事情当作一个文字来处理。请参阅@user2357112:…以及不需要转义的工具,包括内置的
open
函数,以及Python中几乎所有其他函数,除了像
os.system
这样的少数函数……我没有试图打开文件,正如您所看到的,我正在使用内置工具os.path.getsize()。它确实需要转义,我已尝试将r放入替换中,但没有任何帮助。@user2666063:No,
os.path.getsize()
不需要转义。从shell中执行此操作:
mkdir“dir with spaces”;触摸“带空格的目录/带空格的文件”
。然后跑。它将成功打印出
0
。r代表原始字符串,而不是原始文件一个严重错误:P已纠正:)我将尝试您的第一个建议,但我不确定您的第二个建议将包含什么内容,因为我使用的是类unix系统。在unix系统上,这些都不相关。除非您的字符串是源代码中的文字,否则这些都不相关;如果您是从一个文件中读取它们(如问题中所解释的),那么raw-ify就没有文本了..rstrip()对我不起作用,文件中有空格names@fdsfdsfdsfds是的,还有?正如答案所解释的,文件名中的空格非常好。它们非常好,我用open(…)打开它们时会出现错误function@fdsfdsfdsfds我不知道你的问题是什么,但你可能需要提出一个新问题。您可以单击
共享
图标,获取指向此答案或相关问题的链接。然后提供一个示例,显示您正在执行的操作以及出现的错误。@abarnert-在发送到os.system()之前,您将如何处理字符串?
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)