সিএসভি রিডারে (পাইথন) "লাইনে ন্যুয়াল বাইট থাকে"


86

আমি এমন একটি প্রোগ্রাম লেখার চেষ্টা করছি যা একটি .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

আমাকে এই বিন্দুতে পেতে এখানে এমনকি সমস্ত লোককে কৃতিত্ব ।


কেবল একটি অনুমান তবে এটি আপনার শোনার মতো মনে হয়। Csv ফাইলে একটি ফাঁকা রেখা রয়েছে (শেষে মেবে?) এই ব্যতিক্রম পাঠ্যের জন্য csvParser.py ফাইলে দেখার চেষ্টা করুন।
স্যাম এক্স

আমি আসলে ইনপুট সিএসভি ফাইল দিয়ে গিয়েছিলাম এবং যে কোনও এবং সমস্ত ফাঁকা জায়গা থেকে মুক্তি পেয়েছি ... এখনও ভাগ্য নেই (একই ত্রুটি)।
জেমস রোজম্যান

লাইন নম্বরটি নির্দিষ্ট করতে, আমি আপনাকে একটি পাল্টা ভেরিয়েবল প্রবর্তন এবং for row in readerলুপের মধ্যে বাড়ানোর পরামর্শ দিই ।
কোডেপ

আমি নিশ্চিত না যে যখন প্রোগ্রামটি নিজেই সম্পাদন করবে না তখন কীভাবে আমার তা করা উচিত। আমি একটি কাউন্টার যুক্ত করার চেষ্টা করেছি এবং আলাদা কিছু দেখানো হয়নি, ঠিক একই ট্রেসব্যাক ত্রুটি।
জেমস রোজম্যান

4
আপনার .csv এ কি নাল বাইট আছে? open('input.csv').read().index('\0')আপনি যদি করেন তবে আপনাকে প্রথমটির অফসেট দেবে।
retracile

উত্তর:


69

আমি একটি সহজ সমাধান সঙ্গে একই সমস্যা সমাধান করেছি:

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

কীটি ইউটিএফ -16 এনকোডিং সহ ফাইলটি খোলার জন্য কোডেক মডিউলটি ব্যবহার করছিল, অনেকগুলি এনকোডিং রয়েছে, ডকুমেন্টেশন চেক করুন ।


4
আমার একই সমস্যা ছিল লিবারঅফিস থেকে তৈরি সিএসভি ফাইলের সাথে, যা মূলত একটি এক্সেল। এক্সএলএস ফাইল থেকে খোলা হয়েছিল। কোনও কারণে, লাইব্রোফিস সিএসভি ফাইলটিকে ইউটিএফ -16 হিসাবে সংরক্ষণ করেছিল। ফাইলের প্রথম 2 বাইট দেখে আপনি বলতে পারেন, এটি যদি এফএফ এফ হয় তবে এটি একটি ভাল সূচক যে এটি ইউটিএফ -16
টম ডালটন

4
মনে রাখবেন যে আপনার ফাইলটিতে যদি ইউএসএফ -16 ডেটা থাকে যা ASCII সীমার বাইরে থাকে তবে csv.reader() এটি হ্যান্ডেল করতে সক্ষম হবে না এবং UnicodeEncodeErrorএর পরিবর্তে আপনি এস পাবেন ।
মার্টিজন পিটারস

7
এটি কেবল একটি পৃথক ত্রুটি উত্থাপিত করেছিল,UnicodeError: UTF-16 stream does not start with BOM
সেরিন

আমার ক্ষেত্রে ছিল 'utf-16le'
পাউয়ে এস্কজুর

70

আমি অনুমান করছি ইনপুট। সিএসভিতে আপনার একটি 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 বা কিছু 'আকর্ষণীয়' বলে ইঙ্গিত দিতে পারে।


4
+1 টি শূন্য খোঁজার ফাইল বাইট ... unforetunately এখন আমার 'corrected.csv' ফাইলটি বর্তমানে জাপানি ভাষায় লেখা ...
জেমস Roseman

আপনার .csv এর মতো শব্দগুলি ascii তে নেই। আমি মনে করি আরও সাহায্যের জন্য আপনার .csv এর প্রকৃত সামগ্রী সম্পর্কে কিছুটা আরও বেশি তথ্য প্রয়োজন। আপনি কি ভিএম বা নোটপ্যাডের মতো কোনও পাঠ্য সম্পাদককে এটি খোলার চেষ্টা করেছেন? বা file input.csvফাইলের ধরণ চিহ্নিত করতে দৌড়াচ্ছেন ?
পুনরায় প্রত্যাহার করুন

আমি এটি নোটপ্যাডে খুলেছি এবং দেখতে এটি দুর্দান্ত। সিএসভি দেখতে কেমন হওয়া উচিত? এটি গুগল অ্যানালিটিকাসের মতোই পড়তে পারে তবে ডেটার মধ্যে বিশাল ট্যাব রয়েছে।
জেমস রোজম্যান 20

অভিশাপ ... কমা দিয়ে ট্যাবগুলি প্রতিস্থাপন করার কোনও উপায় আছে এবং এটি পাইথন প্রোগ্রামের সাথে কাজ করে?
জেমস রোজম্যান 20

4
যদি আপনার CSV ট্যাব সীমায়িত কার্যকরভাবে আপনি এখন উল্লেখ করা প্রয়োজন: reader = csv.reader(mycsv, delimiter='\t')। আমি ইমেজিং করছি যে সিএসভি পাঠক আপনার সম্পূর্ণ ফাইলটি কমা খুঁজছেন এবং ইওএফ-তে সমস্ত উপায় পাচ্ছেন। তবে আপনার অবশ্যই একটি এনকোডিং সমস্যা আছে। ফাইলটি খোলার সময় আপনাকে এনকোডিং নির্দিষ্ট করতে হবে।
স্টিভেন রাম্বালস্কি

15

আপনি যদি নালগুলি কোনও কিছুর সাথে প্রতিস্থাপন করতে চান তবে আপনি এটি করতে পারেন:

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

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

4
কোনও স্থানের সাথে নালটি প্রতিস্থাপন করা ভাল পছন্দ হবে না। আমার খালি স্ট্রিংয়ের সাথে প্রতিস্থাপনের জন্য কাজ করেছেন
মার্সেলো অ্যাসিস

আপনি ফলন কীভাবে ব্যবহার করেছেন তা সম্পর্কে আমার একটি প্রশ্ন রয়েছে। প্রদত্ত যে এটি একটি লুপে আছে, এর অর্থ কি এই যে এটি এখনও ফাইলটি লাইন দ্বারা পঠন করবে বা এটি একবারে এটি মেমোরিতে লোড করবে?
mnsr

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/resultsPCT20161108.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

সম্ভবত এই daniweb থেকে সহায়ক হবে:

একটি সিএসভি ফাইল থেকে পড়ার সময় আমি এই ত্রুটিটি পাচ্ছি: "রানটাইম ত্রুটি! লাইনে ন্যুয়াল বাইট রয়েছে"। এই ত্রুটির মূল কারণ সম্পর্কে কোনও ধারণা?

...

ঠিক আছে, আমি এটি পেয়েছি এবং ভেবেছিলাম সমাধানটি পোস্ট করব। কেবলমাত্র আমার দুঃখ ঘটিয়েছে ... ব্যবহৃত ফাইলটি .csv এর পরিবর্তে .xls ফর্ম্যাটে সংরক্ষণ করা হয়েছিল এটি ধরেনি কারণ টাইপটি এখনও .xls থাকাকালীন ফাইলের নামটিতে নিজেই .csv এক্সটেনশন ছিল because


4
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

ঠিক আছে. তারপরে এটি খুব প্রথম লাইনে দম বন্ধ হয়ে গেছে। এটি চালান এবং যা দেখেন তা পোস্ট করুন:print(open('input.csv', 'r').readlines()[0])
স্টিভেন রুম্বালস্কি

কিছু মজাদার ... তবে এটি চলছে। ÿþ/<এটি এটিকেই পেস্ট করবে (এটি বেশিরভাগ ব্লক এবং সংখ্যা)
জেমস রোজম্যান

4
সম্ভবত আপনার সিএসভি সত্যই কোনও সিএসভি নয়। আমার উত্তর দ্বিতীয়ার্ধ দেখুন।
স্টিভেন রাম্বালস্কি

ওহ শ্যুট এটি সম্পূর্ণরূপে হতে পারে, আমি এটি ঠিক করতে কীভাবে যেতে পারি? আমি গুগল অ্যানালিটিক্স থেকেও সরাসরি এটি সংরক্ষণ করেছিলাম ...
জেমস রোজম্যান

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)    

বিশাল ফাইলগুলির জন্য সবচেয়ে কার্যকর সমাধান efficient

পাইথন 3, কুবুন্টু জন্য চেক করা হয়েছে


1

আমি সম্প্রতি এই সমস্যাটি স্থির করেছি এবং আমার দৃষ্টিতে এটি একটি ফাইল যা সংকীর্ণ হয়েছিল যে আমি পড়ার চেষ্টা করছিলাম। প্রথমে ফাইল ফর্ম্যাটটি পরীক্ষা করে দেখুন। তারপরে পরীক্ষা করে দেখুন যে সামগ্রীগুলি কী কী এক্সটেনশনকে বোঝায়।


1

আমার লিনাক্স পরিবেশটিকে একটি সম্পূর্ণ সম্পূর্ণ ইউটিএফ -8 পরিবেশে পরিণত করা আমার পক্ষে কৌশলটি তৈরি করেছিল। আপনার কমান্ড লাইনে নিম্নলিখিতটি চেষ্টা করুন:

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

আমার জন্যও ইউটিএফ -8 এ পরিবর্তন করা সমস্যার সমাধান করেছে। উইন্ডোজগুলিতে আমি নোটপ্যাড ++ ব্যবহার করে UTF16 থেকে UTF8 তে ফর্ম্যাটটি পরিবর্তন করতে পারি। তারপরে আমি ফ্রি ফ্রি ক্যালক দিয়ে ফাইলটি খুললাম, এবং অতিরিক্ত লাইন ইত্যাদি সাফ করলাম
যুবাল হারপাজ

1

এটি দীর্ঘস্থায়ী, তবে আমি এই উত্তরটি পেরিয়ে গিয়েছি কারণ কেরাস এবং টেনসরফ্লোতে প্রশিক্ষণের ডেটা হিসাবে প্রক্রিয়া করার জন্য একটি সিএসভি পড়ার সময় আমি একটি অপ্রত্যাশিত ত্রুটি অনুভব করছিলাম।

আমার ক্ষেত্রে, বিষয়টি অনেক সহজ ছিল এবং এটি সম্পর্কে সচেতন হওয়া মূল্যবান। সিএসভিতে উত্পাদিত হওয়া ডেটা সামঞ্জস্যপূর্ণ ছিল না, ফলস্বরূপ কিছু কলাম পুরোপুরি অনুপস্থিত, যা মনে হয় এই ত্রুটিটিও ছুঁড়েছে।

পাঠ: আপনি যদি এই ত্রুটিটি দেখে থাকেন তবে যাচাই করুন যে আপনার ডেটা আপনার মনে হয় যেভাবে এটি করে!


0

এটা খুব সহজ।

"নতুন এক্সেল তৈরি করুন" বা উইন্ডো থেকে ".csv" হিসাবে সংরক্ষণ করে কোনও সিএসভি ফাইল তৈরি করবেন না।

কেবল সিএসভি মডিউল আমদানি করুন, একটি ডামি সিএসভি ফাইল লিখুন এবং তারপরে আপনার ডেটা আটকে দিন।

পাইথন সিএসভি মডিউল নিজেই তৈরি সিএসভি আপনাকে আর এনকোডিং বা ফাঁকা লাইন ত্রুটি দেখাবে না।


-1

pandas.read_csv পড়া / লেখার সময় এখন বিভিন্ন ইউটিএফ এনকোডিং পরিচালনা করে এবং তাই নাল বাইটগুলি সরাসরি ডিল করতে পারে

data = pd.read_csv(file, encoding='utf-16')

দেখতে https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.