CSVリーダー(Python)の「行にNULLバイトが含まれています」


84

.CSVファイル(input.csv)を調べ、テキストファイル(output.txt)にリストされているように、特定の要素(corrected.csv)で始まる行のみを書き換えるプログラムを作成しようとしています。

これは私のプログラムが今どのように見えるかです:

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

私をこの点に到達させるためにさえ、ここにいるすべての人々の功績です。


推測ですが、input.csvファイルに空白行が含まれているようです(最後にメベ?)。csvParser.pyファイルでその例外テキストを調べてみてください。
サムアックス

私は実際にinput.csvファイルを調べて、すべての空白スペースを取り除きました...それでも運がありません(同じエラー)。
James Roseman 2011年

行番号を正確に特定するには、カウンター変数を導入して、for row in readerループ内でインクリメントすることをお勧めします。
codeape 2011年

プログラム自体が実行されないときに、どのようにそれを行うべきかわかりません。カウンターを追加しようとしましたが、同じトレースバックエラーで、何も変わりませんでした。
James Roseman 2011年

4
.csvにNULLバイトがありますか? open('input.csv').read().index('\0')あなたがそうするならば、あなたに最初のもののオフセットを与えるでしょう。
retracile 2011年

回答:


66

私はより簡単な解決策で同様の問題を解決しました:

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

重要なのは、コーデックモジュールを使用してUTF-16エンコーディングでファイルを開くことでした。エンコーディングは他にもたくさんありますドキュメントを確認してください。


4
もともとExcelの.xlsファイルから開かれていたLibreOfficeから作成されたCSVファイルでも同じ問題が発生しました。何らかの理由で、LibreOfficeはCSVファイルをUTF-16として保存していました。ファイルの最初の2バイトを見るとわかりますが、それがFF FEの場合は、UTF-16であることを示す良い指標です
Tom Dalton 2013年

4
ファイルにASCII範囲外の UTF-16データが含まれている場合、csv.reader()それを処理できず、UnicodeEncodeError代わりにsを取得することに注意してください。
MartijnPieters

6
これにより、別のエラーが発生しましたUnicodeError: UTF-16 stream does not start with BOM
Cerin 2017

私の場合はでした'utf-16le'
パヴェルSzczur

69

input.csvにNULバイトがあると思います。あなたはそれをテストすることができます

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または「興味深い」ものがあることを示している可能性があります。


5
ファイル内のNULLバイトを見つけると+1 ...残念ながら今では私の 'corrected.csv'ファイルが日本語で読み取られるようになりました...–
James Roseman

.csvがASCIIに含まれていないようです。さらにヘルプを表示するには、.csvの実際のコンテンツについてもう少し情報が必要になると思います。vimやメモ帳などのテキストエディタで開いてみましたか?またはfile input.csv、ファイルタイプを識別するために実行していますか?
retracile 2011年

メモ帳で開いたところ、問題ないようです。csvはどのように見えるべきですか?Google Analyticsと同じように読み取りますが、データ間に大きなタブがあります。
James Roseman 2011年

くそー...タブをコンマに置き換えてPythonプログラムで動作させる方法はありますか?
James Roseman 2011年

1
csvがタブ区切りの場合は、次のように指定する必要がありますreader = csv.reader(mycsv, delimiter='\t')。csvリーダーがファイル全体を取得してコンマを探し、EOFに到達していることをイメージしています。しかし、あなたは間違いなくエンコーディングの問題を抱えています。ファイルを開くときにエンコーディングを指定する必要があります。
Steven Rumbalski 2011年

11

nullを何かに置き換えたい場合は、次のようにします。

def fix_nulls(s):
    for line in s:
        yield line.replace('\0', ' ')

r = csv.reader(fix_nulls(open(...)))

2
nullをスペースに置き換えるのは良い選択ではありません。空の文字列に置き換えるために働いた
Marcelo Assis 2018年

利回りをどのように使用したかについて質問があります。これがループ内にあるとすると、ファイルを1行ずつ読み取るのでしょうか、それとも一度にメモリにロードするのでしょうか。
mnsr

10

null値が存在しないふりをしたい場合は、ジェネレーターをインライン化してnull値をフィルターで除外することができます。もちろん、これは、ヌルバイトが実際にはエンコーディングの一部ではなく、実際にはある種の誤ったアーティファクトまたはバグであると想定しています。

(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)

ありがとう!これは、NC選挙結果ファイルで機能しました。NC選挙結果ファイルは、実際には(!)1つの列の「0」バイトの代わりにヌルバイトを使用します。dl.ncsbe.gov/ENRS/resultsPCT20161108.zip
nealmcb 2016

7

これにより、問題のある行がわかります。

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

おそらくこれはdaniwebから役立つでしょう:

csvファイルから読み取るときに次のエラーが発生します:「ランタイムエラー!行にNULLバイトが含まれています」。このエラーの根本原因について何か考えはありますか?

..。

はい、わかりました。解決策を投稿すると思いました。単にまだ私に悲しみを引き起こしました...使用されたファイルは.csvの代わりに.xls形式で保存されましたタイプがまだ.xlsであったのにファイル名自体が.csv拡張子を持っていたのでこれをキャッチしませんでした


1
Traceback (most recent call last): File "C:\Python32\Sample Program\csvParser.py", line 17, in <module> print ('csv choked on line %s' % (i+1)) NameError: name 'i' is not defined
James Roseman 2011年

OK。それからそれは最初の行で窒息しています。これを実行し、あなたが何を参照してくださいポスト:print(open('input.csv', 'r').readlines()[0])
スティーブンRumbalski

ファンキーな何か...しかし、それは実行されています。ÿþ/<貼り付けるのはそれだけです(ほとんどがブロックと数字です)
James Roseman 2011年

1
おそらく、あなたのcsvは実際にはcsvではありません。私の答えの後半を参照してください。
Steven Rumbalski 2011年

ああ、それは完全にそれである可能性があります、どうすればこれを修正できますか?私は...あまりにもストレートGoogleアナリティクスからそれを保存
ジェームズ・ローズマン

2

トリッキーな方法:

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をチェック


1

私は最近この問題を修正しました、そして私の例ではそれは私が読み込もうとしていた圧縮されたファイルでした。最初にファイル形式を確認してください。次に、内容が拡張機能が参照しているものであることを確認します。


1

私のLinux環境をクリーンで完全なUTF-8環境に変えることは、私にとってトリックでした。コマンドラインで次のことを試してください。

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

私にとってもUTF-8に変更することで問題は解決しました。Windowsでは、Notepad ++を使用して形式をUTF16からUTF8に変更しました。私は、LibreOfficeのCALCでファイルを開き、などの余分なラインをクリア
のYuval Harpaz

1

これは長い間解決されましたが、KerasとTensorFlowでトレーニングデータとして処理するCSVを読み取っているときに予期しないエラーが発生したため、この回答に遭遇しました。

私の場合、問題ははるかに単純であり、意識する価値があります。CSVに生成されるデータに一貫性がなく、一部の列が完全に欠落しているため、このエラーもスローされるようです。

レッスン:このエラーが表示された場合は、データが思ったとおりに表示されていることを確認してください。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.