2014-01-07 31 views
1

我有一個CSV文件,它在某些數據中嵌入了NUL字節。python在數據中使用NUL字節的CSV文件的Dictread

是給予列ABCD列C將有一個像

,引號字符「一些數據」 NUL「更多數據」 NUL「數據結束」引號字符數據的領域之一,

當我用LIBRE Office Calc打開它,NUL字符不會出現在顯示屏上,如果我用手保存它們,它們就會消失。我可以在vi中看到NUL字符,並且可以在vi中用tr或者用手去除或替換它們,但我希望能夠自動使用python程序處理它。

的DictReader過程

在INFILE行:會拋出異常,因此,除非是外循環,也不會回去取下一行(或允許我到NULL字符更改爲空間或嵌入式逗號並處理該行)。

幸運的是,數據似乎有其他失效,所以我可能會在任何情況下跳過它。但是,問題是我如何告訴Python去下一行。

+0

請顯示你的實際循環作爲參考點。 –

回答

1

所以這有點難看,但它似乎工作。你可以像正常一樣讀取一行,清理違規的字節,然後使用StringIO對象將它傳遞給DictReader。這裏是代碼,假設你的csv有一個標題記錄(如果你不這樣做,它應該更簡單):

#!/usr/bin/env python 

import StringIO 
import csv 
import ipdb 

fin = open('somefilewithnulls', 'rb') 
fout = StringIO.StringIO() 
reader = csv.DictReader(fout) 

while True: 
    # for the first record prep StringIO with the first 
    # two lines so DictReader can create header 
    line = fin.readline() if fin.tell() else fin.readline() + fin.readline() 
    if not len(line): 
     break 

    # clean the line before passing it to DictReader 
    line = line.replace('\x00', '') 

    fout.write(line) 
    fout.seek(-len(line), 1) 

    rec = reader.next() 
    print rec 
+0

謝謝。現在,我使用tr在bash中預處理器來清理處理字典中最初設置的文件。我將在未來記住這一點,以便它可以成爲Python處理的一部分。 – sabbahillel

相關問題