如何在python代码中处理具有\ x的unix命令

时间:2014-12-06 06:05:50

标签: python-2.7 unix

我想执行命令

sed -e 's/\x0//g' file.xml

使用Python代码。

但是收到错误 ValueError:invalid \x escape

2 个答案:

答案 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更自然。使用什么语法取决于trsed的方言,但基本问题是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