2011-10-25 38 views
49

我試圖寫一個方案,着眼於.CSV文件(input.csv)和重寫僅與某一個元素開始行(corrected.csv ),如文本文件(output.txt)中所列。「行包含空字節」的CSV閱讀器(Python)的

這是我的程序看起來像現在:

import csv 

lines = [] 
with open('output.txt','r') as f: 
    for line in f.readlines(): 
     lines.append(line[:-1]) 

with open('corrected.csv','w') as correct: 
    writer = csv.writer(correct, dialect = 'excel') 
    with open('input.csv', 'r') as mycsv: 
     reader = csv.reader(mycsv) 
     for row in reader: 
      if row[0] not in lines: 
       writer.writerow(row) 

不幸的是,我不斷收到這個錯誤,我不知道什麼是什麼。

Traceback (most recent call last): 
    File "C:\Python32\Sample Program\csvParser.py", line 12, in <module> 
    for row in reader: 
_csv.Error: line contains NULL byte 

感謝所有的人here甚至讓我到這一點。

+0

只是一個猜測,但它聽起來像你input.csv文件包含一個空行(mebe在結束了嗎?)。嘗試在csvParser.py文件中查找該例外文本。 –

+0

我其實只是通過input.csv文件並擺脫了任何和所有的空白...仍然沒有運氣(同樣的錯誤)。 –

+0

爲了精確定位行號,我建議你引入一個計數器變量,並在''for reader''循環行''中增加它。 – codeape

回答

38

我已經解決了類似的問題,一個簡單的解決方案:

import codecs 
csvReader = csv.reader(codecs.open('file.csv', 'rU', 'utf-16')) 

關鍵是使用編解碼器模塊以UTF-16編碼打開文件,有更多的編碼,請檢查documentation

+0

感謝您的回答!也感謝資源,這現在有很多意義。 –

+2

我對從LibreOffice創建的CSV文件有相同的問題,它最初是從Excel .xls文件打開的。出於某種原因,LibreOffice已將CSV文件保存爲UTF-16。您可以通過查看文件的前兩個字節來判斷,如果它是FF FE,那麼它是一個很好的指示器,它是UTF-16 –

+4

請注意,如果您的文件包含超出ASCII範圍*的UTF-16數據* csv .reader()'將無法處理它,您將得到'UnicodeEncodeError's。 –

42

我猜你有一個input.csv NULL字節。您可以測試與

if '\0' in open('input.csv').read(): 
    print "you have null bytes in your input file" 
else: 
    print "you don't" 

如果你這樣做,

reader = csv.reader(x.replace('\0', '') for x in mycsv) 

可能讓你解決這一問題。或者它可能表明你在.csv文件中有'utf16'或'有趣'的東西。

+2

+1在文件中查找空字節......不幸的是,現在我的'corrected.csv'文件現在以日文顯示... –

+0

聽起來像.csv不在ascii中。我想進一步的幫助需要更多關於.csv實際內容的信息。你有沒有試過在像vim或notepad這樣的文本編輯器中打開它?或者運行'file input.csv'來識別文件類型? – retracile

+0

我用記事本打開它,看起來很好。 csv應該是什麼樣子?它的讀取方式與Google Analytics中的相同,但是數據之間有巨大的選項卡。 –

4

這會告訴你什麼行的問題。

import csv 

lines = [] 
with open('output.txt','r') as f: 
    for line in f.readlines(): 
     lines.append(line[:-1]) 

with open('corrected.csv','w') as correct: 
    writer = csv.writer(correct, dialect = 'excel') 
    with open('input.csv', 'r') as mycsv: 
     reader = csv.reader(mycsv) 
     try: 
      for i, row in enumerate(reader): 
       if row[0] not in lines: 
        writer.writerow(row) 
     except csv.Error: 
      print('csv choked on line %s' % (i+1)) 
      raise 

也許this從daniweb將是有益的:

I'm getting this error when reading from a csv file: "Runtime Error! line contains NULL byte". Any idea about the root cause of this error?

...

Ok, I got it and thought I'd post the solution. Simply yet caused me grief... Used file was saved in a .xls format instead of a .csv Didn't catch this because the file name itself had the .csv extension while the type was still .xls

+0

'Traceback(last recent call last): print'('csv在行%s'%(i + 1)上窒息) 「C:\ Python32 \ Sample Program \ csvParser.py」,第17行,在 NameError:名稱'i'未定義' –

+0

好的。然後它在第一條線上窒息。運行這個併發布你看到的東西:'print(open('input.csv','r')。readlines()[0])' –

+0

東西很時髦......但它正在運行。 'ÿþ/'<這就是所有它會粘貼(這主要是塊和數字) –

4

你可以只內聯生成過濾掉空值,如果你想假裝它們不存在。當然,這是假設空字節不是編碼的真正部分,實際上是某種錯誤的工件或錯誤。

請參見下面的(line.replace('\0','') for line in f),還你會想可能打開該文件使用起來模式rb

import csv 

lines = [] 
with open('output.txt','r') as f: 
    for line in f.readlines(): 
     lines.append(line[:-1]) 

with open('corrected.csv','w') as correct: 
    writer = csv.writer(correct, dialect = 'excel') 
    with open('input.csv', 'rb') as mycsv: 
     reader = csv.reader((line.replace('\0','') for line in mycsv)) 
     for row in reader: 
      if row[0] not in lines: 
       writer.writerow(row) 
+0

謝謝!這適用於NC選舉結果文件,確實(!)在一列中使用空字節代替「0」字節。請參閱http://dl.ncsbe.gov/ENRS/resultsPCT20161108.zip – nealmcb

0

我最近修正了這個問題,在我的情況下它是被壓縮,我試圖讀取文件。首先檢查文件格式。然後檢查內容是什麼擴展名引用。

0

把我的linux環境到一個乾淨的完整的UTF-8環境所做的把戲我。 嘗試在以下命令行:

export LC_ALL=en_US.UTF-8 
export LANG=en_US.UTF-8 
export LANGUAGE=en_US.UTF-8 
0

一個取巧的辦法:

如果Lunux下開發,您可以使用sed一切的能力

from subprocess import check_call, CalledProcessError 

PATH_TO_FILE = '/home/user/some/path/to/file.csv' 

try: 
    check_call("sed -i -e 's|\\x0||g' {}".format(PATH_TO_FILE), shell=True) 
except CalledProcessError as err: 
    print(err)  

最高效的解決方案來處理大文件

檢查Python3,Kubuntu的