我想执行命令
sed -e 's/\x0//g' file.xml
使用Python代码。
但是收到错误 ValueError:invalid \x escape
答案 0 :(得分:1)
你没有展示你的Python代码,所以这里有猜测的空间。
但首先,为什么文件首先包含空字节?它不是有效的XML文件。你能解决生成这个文件的过程吗?
其次,为什么要用sed
执行此操作?你已经在使用Python;使用其原生函数进行此类处理。如果您希望逐行读取文件,例如
with open('file.xml', 'r') as xml:
for line in xml:
line = line.replace('\x00', '')
# ... your processing here
或者如果您希望整个文件为一个长字节字符串:
with open('file.xml', 'r') as handle:
xml = handle.read()
xml = xml.replace('\x00', '')
如果您确实想要使用外部程序,tr
会比sed
更自然。使用什么语法取决于tr
或sed
的方言,但基本问题是Python字符串中的反斜杠由Python解释。如果涉及到shell,您还需要考虑shell的处理。但用非常简单的术语来说,试试这个:
os.system("sed -e 's/\\x0//g' file.xml")
或者这个:
os.system(r"sed -e 's/\x0//g' file.xml")
这里,双引号内的单引号是必需的,因为shell解释了这一点。如果使用其他形式的引用,则需要了解shell在引用机制下的行为,以及它如何与Python的引用交互。但是你首先不需要shell,我猜你的处理可能看起来更像是这样:
sed = subprocess.Popen(['sed', '-e', r's/\x0//g', 'file.xml'],
stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
result, err = sed.communicate()
因为这里没有涉及shell,所以你需要担心的是Python的引用。就像以前一样,您可以通过加倍或使用sed
原始字符串将文字反斜杠转发给r'...'
。
答案 1 :(得分:0)
Python中的十六进制转义需要两个十六进制数字。
\x00