2014-12-06 78 views
-1

\ X UNIX命令我想用Python代碼來執行命令如何處理具有Python代碼

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

但收到錯誤ValueError異常:invalid \x escape

+2

請將您的python代碼和示例內容粘貼到file.xml中。 – BMW 2014-12-06 06:09:11

回答

0

十六進制轉義在Python需要兩個十六進制數字。

\x00 
+0

但我只想執行「sed -e's/\ x0 // g'file.xml」,這幫助我從xml文件中刪除無效字符。我不需要一個十六進制。 – 2014-12-06 06:23:24

+0

然後你需要告訴Python。 – 2014-12-06 06:23:41

+0

但我怎麼能告訴python? – 2014-12-06 06:25:52

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引用進行交互。但你並不真的在這裏需要一個殼擺在首位,而我在現實中猜你可能處理看上去更像是這樣的:

sed = subprocess.Popen(['sed', '-e', r's/\x0//g', 'file.xml'], 
    stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
result, err = sed.communicate() 

因爲沒有外殼這裏涉及到,所有你需要擔心是Python的引用。就像以前一樣,您可以將字面反斜槓轉換爲sed,方法是將其加倍或使用r'...'原始字符串。