2013-06-05 74 views
0

(本問題是關係到this oneCSV讀者:行包含NULL字節

我讀解析CSV內容,先前已加載到內存中:

def ReadTxtIntoColumns(txt, columns): 
    rows = [] 
    print txt 
    print txt.find('\x00') 
    print txt.count('\x00') 
    f = StringIO(txt) 
    try: 
     reader = csv.reader(f, delimiter=' ', skipinitialspace=True) 
     for row in reader: 
      # Merge all extra columns 
      if len(row) >= columns: 
       rest = ' '.join(row[columns-1:]) 
       del row[columns-1:] 
       row.append(rest) 
      # And now set missing columns to None 
      for i in range (len (row), columns): 
       row.append(None) 
      rows.append(row) 
    except csv.Error, e: 
     log.error('ReadTxtIntoColumns > Problems reading csv from string > line %d: %s', reader.line_num, e) 
    finally: 
     f.close() 
    return rows 

輸入數據已經被手 - 由我寫的(一個簡單的文本文件,空格分開)。有沒有「\ x00的」所有在我的輸入數據,但CSV抱怨吧:

ReadTxtIntoColumns > Problems reading csv from string > line 1: line contains NULL byte 

什麼是錯誤訊息呢?

編輯

這是我簡單的輸入數據,我已經驗證這仍然引起了同樣的問題:

#COMMAND      USER  DIRECTORY      SAFE COMMAND 
uname       -   -        FALSE uname -a 
sleep       -   -        FALSE sleep 100 
+0

您不需要將輸入封裝在'StringIO'對象中;只要通過任何迭代;例如,'text.splitlines(True)'會很好。 –

+0

您能否給我們提供一個能夠重現問題的最小樣本「文本」值? –

+0

不會'numpy.loadtxt'爲你的情況工作嗎? –

回答

3

csv module包含以下警告:

這個版本的csv模塊不支持Unicode輸入。此外,目前有關於ASCII NUL字符的一些問題。因此,所有輸入應該是UTF-8或可打印的ASCII,以確保安全;請參閱示例部分中的示例。

StringIO.StringIO對象支持Unicode,但如果您使用的是cStringIO模塊,然後cStringIO.StringIO沒有,並可能導致更多的問題。

如果你的數據是ASCII而已,簡單地編碼txt第一:

txt = txt.encode() 

有可能是一些修補程序添加到2.7.3,使這個問題不太明顯。

1

csv模塊在從Unicode編碼文件讀取數據時出現問題。當我將代碼粘貼到Python解釋器並用手動輸入的文本字符串調用它時,它的工作方式起作用,所以如果您嘗試將文件保存爲ANSI/ASCII格式,或者在將文件加載到內存時將其轉換爲ASCII,它應該可以正常工作。

相關問題