CSV रीडर (पायथन) में "रेखा में NULL बाइट शामिल है"


84

मैं एक प्रोग्राम लिखने की कोशिश कर रहा हूं जो एक .CSV फ़ाइल (input.csv) को देखता है और केवल उन पंक्तियों को फिर से लिखता है जो एक निश्चित तत्व (corrected.csv) से शुरू होती हैं, जैसा कि एक पाठ फ़ाइल (output.txt) में सूचीबद्ध है।

यह मेरा कार्यक्रम अभी जैसा दिखता है:

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 फ़ाइल में एक रिक्त रेखा है (अंत में mebe?)। उस अपवाद पाठ के लिए csvParser.py फ़ाइल में देखने का प्रयास करें।
सैम ऐक्स

मैं वास्तव में सिर्फ input.csv फ़ाइल के माध्यम से चला गया और किसी भी और सभी रिक्त स्थान से छुटकारा पा लिया ... अभी भी कोई भाग्य (एक ही त्रुटि) नहीं है।
जेम्स रोसमैन

पंक्ति संख्या को इंगित करने के लिए, मेरा सुझाव है कि आप एक काउंटर चर पेश करें और इसे for row in readerलूप के भीतर बढ़ाएँ।
कोडेप

मुझे यकीन नहीं है कि मैं ऐसा करने वाला हूं कि जब कार्यक्रम खुद ही निष्पादित नहीं होगा। मैंने एक काउंटर जोड़ने की कोशिश की और कुछ भी अलग नहीं दिखाया, बस एक ही ट्रेसबैक त्रुटि।
जेम्स रोसमैन

4
क्या आपके पास .csv में एक NULL बाइट है? open('input.csv').read().index('\0')यदि आप ऐसा करते हैं तो आप पहले वाले की भरपाई करेंगे।
रिट्रासिल

जवाबों:


66

मैंने एक आसान समाधान के साथ एक समान समस्या हल की है:

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

कुंजी UTF-16 एन्कोडिंग के साथ फ़ाइल को खोलने के लिए कोडेक्स मॉड्यूल का उपयोग कर रही थी, बहुत सारे एन्कोडिंग हैं, प्रलेखन की जांच करें ।


4
लिबरेऑफ़िस से बनाई गई CSV फ़ाइल के साथ मुझे यही समस्या थी, जो मूल रूप से एक एक्सेल .xls फ़ाइल से खोली गई थी। किसी कारण से, लिबर ऑफिस ने CSV फ़ाइल को UTF-16 के रूप में सहेजा था। आप फ़ाइल के पहले 2 बाइट्स को देखकर बता सकते हैं, अगर यह FF FE है तो यह एक अच्छा संकेतक है कि यह UTF-16 है
Tom Dalton

4
ध्यान दें कि यदि आपकी फ़ाइल में UTF-16 डेटा है जो ASCII सीमा के बाहर है, तो csv.reader() इसे संभाल नहीं पाएंगे, और आप UnicodeEncodeErrorइसके स्थान पर हैं।
मार्टिन पीटर्स

6
इससे बस एक अलग त्रुटि पैदा हुई,UnicodeError: UTF-16 stream does not start with BOM
सेरिन

मेरे मामले में यह था 'utf-16le'
पावेल स्ज़ेसुर

69

मुझे लगता है कि आप एक NUL बाइट input.csv में है। आप इसके साथ परीक्षण कर सकते हैं

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
+1 फाइल में NULL बाइट खोजने पर ... अप्रत्याशित रूप से अब मेरी 'corrected.csv' फ़ाइल अब जापानी में पढ़ी जाती है ...
James Roseman

अपने .csv की तरह लगता है कि ascii में नहीं है। मुझे लगता है कि आपकी .csv की वास्तविक सामग्री के बारे में और अधिक जानकारी की आवश्यकता है। क्या आपने इसे विम या नोटपैड जैसे टेक्स्ट एडिटर में खोलने की कोशिश की है? या file input.csvफ़ाइल प्रकार की पहचान करने के लिए चल रहा है?
रिट्रासिल

मैंने इसे नोटपैड में खोला है और यह ठीक लग रहा है। सीएसवी कैसा दिखना चाहिए? यह Google Analytics पर जैसा करता है, वैसा ही पढ़ता है, लेकिन डेटा के बीच भारी टैब के साथ।
जेम्स रोसमैन

लानत है ... टैब को कॉमा से बदलने का कोई तरीका है और क्या यह पायथन प्रोग्राम के साथ काम करता है?
जेम्स रोसमैन

1
यदि आपका सीएसवी टैब सीमांकित है तो आपको इसे निर्दिष्ट करने की आवश्यकता है reader = csv.reader(mycsv, delimiter='\t'):। मैं इमेजिंग करता हूं कि सीएसवी रीडर आपकी पूरी फाइल को कॉमा की तलाश में और ईओएफ के लिए सभी तरह से प्राप्त कर रहा है। लेकिन आपके पास निश्चित रूप से एन्कोडिंग समस्या है। फ़ाइल खोलते समय आपको एन्कोडिंग निर्दिष्ट करने की आवश्यकता होती है।
स्टीवन रंबलस्की

11

यदि आप कुछ ऐसा करने के साथ नल को बदलना चाहते हैं:

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

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

2
रिक्त स्थान के साथ अशक्त करना एक अच्छा विकल्प नहीं होगा। मेरे लिए एक खाली स्ट्रिंग के साथ बदलने के लिए काम किया
Marcelo Assis

मेरे पास एक सवाल है कि आपने उपज का उपयोग कैसे किया है। यह देखते हुए कि यह एक लूप में है, क्या इसका मतलब यह है कि यह अभी भी फ़ाइल लाइन को लाइन से पढ़ेगा या इसे एक ही बार में मेमोरी में लोड करेगा?
मंसूर

10

यदि आप दिखावा करना चाहते हैं तो आप एक जनरेटर को शून्य मानों को फ़िल्टर करने के लिए इनलाइन कर सकते हैं। बेशक यह मान रहा है कि अशक्त बाइट्स वास्तव में एन्कोडिंग का हिस्सा नहीं हैं और वास्तव में किसी प्रकार की गलत कलाकृतियों या बग हैं।

(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" बाइट के स्थान पर एक अशक्त बाइट का उपयोग करते हैं। देखें dl.ncsbe.gov/ENRS/resultsPCT20161108108.zip
nealmcb

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

शायद दानीवेब से यह मददगार होगा:

CSV फ़ाइल से पढ़ते समय मुझे यह त्रुटि आ रही है: "रनटाइम त्रुटि! लाइन में NULL बाइट शामिल है"। इस त्रुटि के मूल कारण के बारे में कोई विचार?

...

ठीक है, मैं समझ गया और सोचा था कि मैं समाधान पोस्ट करूंगा। बस अभी तक मुझे दु: ख हुआ ... प्रयुक्त फ़ाइल को .csv के बजाय .xls प्रारूप में सहेजा गया था, इसलिए इसे नहीं पकड़ा क्योंकि फ़ाइल नाम में .csv एक्सटेंशन था, जबकि प्रकार .xls अभी भी था।


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
20:30 पर जेम्स रोसमैन

ठीक। फिर यह पहली पंक्ति में घुट रहा है। इसे चलाएं और जो भी देखें, उसे पोस्ट करें:print(open('input.csv', 'r').readlines()[0])
स्टीवन रूंबल्स्की

कुछ फंकी ... लेकिन चल रहा है। ÿþ/<यह सब पेस्ट होगा (यह ज्यादातर ब्लॉक और संख्या है)
जेम्स रोसमैन

1
शायद आपका सीएसवी वास्तव में सीएसवी नहीं है। मेरे उत्तर की दूसरी छमाही देखें।
स्टीवन रूंबल्स्की

ओह शूट जो पूरी तरह से हो सकता है, मैं इसे कैसे ठीक कर सकता हूं? मैंने इसे सीधे Google Analytics से भी बचाया ...
जेम्स रोसमैन

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)    

विशाल फ़ाइलों के लिए सबसे कुशल समाधान।

पायथन 3, कुबंटू के लिए जाँच की गई


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 में परिवर्तन करने से समस्या हल हो गई। विंडोज़ पर मैंने यूटीएफ 16 से यूटीएफ 8 के प्रारूप को बदलने के लिए नोटपैड ++ का उपयोग किया। फिर मैंने फ़ाइल को लीबरेफ़ाइस कैलक के साथ खोला, और अतिरिक्त लाइनों आदि को साफ किया
युवल हरपज़

1

यह लंबे समय से तय है, लेकिन मैं इस जवाब में भाग गया, क्योंकि मुझे केरस और टेन्सरफ्लो में प्रशिक्षण डेटा के रूप में संसाधित करने के लिए एक सीएसवी पढ़ने के दौरान एक अप्रत्याशित त्रुटि का सामना करना पड़ रहा था।

मेरे मामले में, मुद्दा बहुत सरल था, और इसके प्रति सचेत रहने के लायक है। CSV में उत्पादित किया जा रहा डेटा सुसंगत नहीं था, जिसके परिणामस्वरूप कुछ कॉलम पूरी तरह से गायब हैं, जो अंत में इस त्रुटि को भी फेंक रहा है।

सबक: यदि आप इस त्रुटि को देख रहे हैं, तो सत्यापित करें कि आपका डेटा उस तरह दिखता है जैसा आपको लगता है कि यह करता है!


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.