Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中转义整个字符串?_Python - Fatal编程技术网

如何在python中转义整个字符串?

如何在python中转义整个字符串?,python,Python,文件可以读取,但首先我将file写成: file=r'D:\tdx\vipdoc\szf10\300383.Txt' text=open(file,"r").read() 我无法将其读取为text=open(文件,“r”)。read() 我想把它分成两部分,失败了 >>> file="D:\tdx\vipdoc\shf10\300383.Txt" >>> file.replace("\x5c","\x5c\x5c") #can't work 'D:\td

文件可以读取,但首先我将
file
写成:

file=r'D:\tdx\vipdoc\szf10\300383.Txt'
text=open(file,"r").read()
我无法将其读取为
text=open(文件,“r”)。read()

我想把它分成两部分,失败了

>>> file="D:\tdx\vipdoc\shf10\300383.Txt"
>>> file.replace("\x5c","\x5c\x5c")  #can't work 
'D:\tdx\x0bipdoc\\\\shf10\xc0383.Txt'
在Martijn Pieters的帮助下,我通过在映射中添加
'\300':r'\300'
解决了这个问题

>>> filename = 'D:\tdx\vipdoc\szf10\300383.Txt'
>>> re.search('(.*?)(\d+\.Txt)',filename).group(1)
'D:\tdx\x0bipdoc\\szf10\xc0'
>>> re.search('(.*?)(\d+\.Txt)',filename).group(2)
'383.Txt'
如果使用
'
而不是
r'
,则需要手动转义字符串文字中的每个反斜杠:

mapping = {'\a': r'\a', '\b': r'\b', '\f': r'\f', '\n': r'\n',
       '\r': r'\r', '\t': r'\t', '\v': r'\v','\300':r'\300'}
filename = 'D:\tdx\vipdoc\szf10\300383.Txt'
for char, escaped in mapping.items():
    filename = filename.replace(char, escaped)

使用
r'
更简单,因为它禁止将
\
解释为转义字符,因此当您只想将
\
本身作为文本斜杠时,不必将其转义。

通常不能,因为例如
'D:\tdx'
,将
\t
解释为制表符。但是,您可以尝试将转义字符转换为与原始字符串相似的内容,但这比首先正确写入该文件名要复杂得多。

我认为,如果您最初使用未转义版本编写,文件名中将包含一些特殊字符。它也将位于脚本最初运行的目录中

\t
将作为制表符显示,\v作为垂直制表符显示,\s正常,\300作为高ascii字符显示

我建议您在python中运行以下命令:

filename = 'D:\\tdx\\vipdoc\\szf10\\300383.Txt'
确保在脚本最初运行的目录中运行它。这应该将其放置在您期望的位置,并使用您期望的文件名


从那时起,您可以使用正确的版本。

因为您的“断开”文件名实际上不包含
\
字符,所以您也不能替换这些字符。您有一个ASCII 9制表符,而不是两个单独的字符
\
t

import shutil
shutil.move('D:\tdx\vipdoc\szf10\300383.Txt',r'D:\tdx\vipdoc\szf10\300383.Txt')
你必须试着“修复”断裂的绳子;这不是万无一失的,但是您可以创建一个替换表来处理常见的转义序列。对于通常不处理回车、制表符或换行符的文件名,这是完全可行的

Python字符串文本只支持有限数量的一个字母
\
转义序列;见:

我省略了多字符序列,因为它们在定义文字时往往会出错。只需将这些字符替换为转义序列:

\a  ASCII Bell (BEL)     
\b  ASCII Backspace (BS)     
\f  ASCII Formfeed (FF)  
\n  ASCII Linefeed (LF)  
\r  ASCII Carriage Return (CR)   
\t  ASCII Horizontal Tab (TAB)   
\v  ASCII Vertical Tab (VT)
import re

filename = re.sub(r'[\x80-\xff]', lambda m: m.group().encode('string_escape'), filename)
或者,我们可以使用
'string\u escape'
编解码器映射这些字符:

mapping = {'\a': r'\a', '\b': r'\b', '\f': r'\f', '\n': r'\n',
           '\r': r'\r', '\t': r'\t', '\v': r'\v'}

for char, escaped in mapping.items():
    filename = filename.replace(char, escaped)
您不能将其应用于整个字符串,因为这将使任何正确转义的反斜杠加倍。此外,对于上面的许多转义码,它将使用
\xhh
转义序列:

所以这种方法并不适合你的需要

对于使用
\xhh
编码的字符,这些字符更难修复。例如,Windows文件系统可以很好地支持Unicode代码点。如果您假设只使用ASCII码点,那么就更容易了。您可以使用正则表达式将其替换为“转义”版本:

>>> '\a'.encode('string_escape')
'\\x07'
这会将ASCII范围之外的任何字节更改为转义序列:

\a  ASCII Bell (BEL)     
\b  ASCII Backspace (BS)     
\f  ASCII Formfeed (FF)  
\n  ASCII Linefeed (LF)  
\r  ASCII Carriage Return (CR)   
\t  ASCII Horizontal Tab (TAB)   
\v  ASCII Vertical Tab (VT)
import re

filename = re.sub(r'[\x80-\xff]', lambda m: m.group().encode('string_escape'), filename)
通过精心选择的字符范围,上述内容也可以应用于所有不可打印的ASCII字符,并用一个表达式修复大多数此类损坏的文件名,前提是我们首先应用上述映射来替换
'string\u escape'
未正确处理的代码:

>>> import re
>>> re.sub(r'[\x80-\xff]', lambda m: m.group().encode('string_escape'), '\xc0')
'\\xc0'
演示您的示例输入:

def repair_filename(filename):
    mapping = {'\a': r'\a', '\b': r'\b', '\f': r'\f', '\v': r'\v'}
    for char, escaped in mapping.items():
        filename = filename.replace(char, escaped)
    filename = re.sub(r'[\x00-\x1f\x7f-\xff]', 
                      lambda m: m.group().encode('string_escape'),
                      filename)
    return filename
这将为您修复大多数此类损坏的文件名。例如,它不会修复
\x09
,因为它也被
\\t
替换

它也不能检测八进制转义码,也不能修复它们。请注意,
\300
已修复为
\xc0
。这需要反复试验,尝试所有可能的组合,或者对输入进行假设。例如,您可以假设
\xhh
从未出现过,但
\ooo
确实出现过

在这种情况下,表达式变为:

>>> def repair_filename(filename):
...     mapping = {'\a': r'\a', '\b': r'\b', '\f': r'\f', '\v': r'\v'}
...     for char, escaped in mapping.items():
...         filename = filename.replace(char, escaped)
...     filename = re.sub(r'[\x00-\x1f\x7f-\xff]', 
...                       lambda m: m.group().encode('string_escape'),
...                       filename)
...     return filename
... 
>>> filename = 'D:\tdx\vipdoc\szf10\300383.Txt'
>>> repair_filename(filename)
'D:\\tdx\\vipdoc\\szf10\\xc0383.Txt'
演示:

哪些有效,哪些无效在很大程度上取决于您所期望的文件名类型。例如,如果您知道文件名的最后部分总是以6位数字结尾,则可以做更多的工作


不过,最好的办法当然是避免完全损坏文件名。

您不需要做任何复杂的事情,Python内置了处理此类问题的工具,特别是,
os.path.normpath
。有关实现的详细信息,请参见。

这些不应该是
\\
等吗,只要在每个路径名中使用正斜杠,让python计算出您的平台使用什么作为路径分隔符。或者在必要时使用
os.path.join
。请在Windows上添加它,因为永远也可以使用正斜杠。
D:\tdx\vipdoc\szf10\300383.Txt
已更改为
D:\\tdx\\vipdoc\\szf10\xc0383.Txt
,如何使其成为D:\\tdx\\vipdoc\\szf10\\300383.Txt`?@it_是_a_文献:是的,现在解决了。@it_是_a_文献:八进制转义码不容易恢复,需要尝试所有可能的组合并查看文件是否存在。我想用正则表达式剪切它,但是我不能,将文件重命名为有效的文件名;之后,您可以使用
filename=r'D:\tdx\vipdoc\szf10\300383.Txt'
>>>导入os>>>file=“D:\tdx\vipdoc\shf10\300383.Txt”>>os.path.normpath(文件)'D:\tdx\x0bipdoc\\shf10\xc0383.Txt',您无法获取它。@这是一篇文献:您读过这篇文章吗?必须用斜杠指定文件名:例如
file=os.path.normpath
def repair_filename(filename):
    mapping = {'\a': r'\a', '\b': r'\b', '\f': r'\f', '\v': r'\v'}
    for char, escaped in mapping.items():
        filename = filename.replace(char, escaped)
    filename = re.sub(r'[\x00-\x1f\x7f-\xff]', 
                      lambda m: m.group().encode('string_escape'),
                      filename)
    return filename
>>> def repair_filename(filename):
...     mapping = {'\a': r'\a', '\b': r'\b', '\f': r'\f', '\v': r'\v'}
...     for char, escaped in mapping.items():
...         filename = filename.replace(char, escaped)
...     filename = re.sub(r'[\x00-\x1f\x7f-\xff]', 
...                       lambda m: m.group().encode('string_escape'),
...                       filename)
...     return filename
... 
>>> filename = 'D:\tdx\vipdoc\szf10\300383.Txt'
>>> repair_filename(filename)
'D:\\tdx\\vipdoc\\szf10\\xc0383.Txt'
filename = re.sub(r'[\x00-\x1f\x7f-\xff]', lambda m: '\\{:o}'.format(ord(m.group())), filename)
>>> def repair_filename(filename):
...     mapping = {'\a': r'\a', '\b': r'\b', '\f': r'\f', '\v': r'\v'}
...     for char, escaped in mapping.items():
...         filename = filename.replace(char, escaped)
...     filename = re.sub(r'[\x00-\x1f\x7f-\xff]', 
...                       lambda m: '\\{:o}'.format(ord(m.group())),
...                       filename)
...     return filename
... 
>>> repair_filename(filename)
'D:\\11dx\\vipdoc\\szf10\\300383.Txt'