পাইথন সিএসভি ত্রুটি: লাইনে ন্যুয়াল বাইট রয়েছে


102

আমি নিম্নলিখিত কোড সহ কয়েকটি সিএসভি ফাইল নিয়ে কাজ করছি:

reader = csv.reader(open(filepath, "rU"))
try:
    for row in reader:
        print 'Row read successfully!', row
except csv.Error, e:
    sys.exit('file %s, line %d: %s' % (filename, reader.line_num, e))

এবং একটি ফাইল এই ত্রুটি নিক্ষেপ করছে:

file my.csv, line 1: line contains NULL byte

আমি কি করতে পারি? গুগল মনে করছে যে এটি কোনও এক্সেল ফাইল হতে পারে যা .csv হিসাবে ভুলভাবে সংরক্ষণ করা হয়েছে। পাইথনের এই সমস্যাটি আমি কীভাবে পেতে পারি?

== আপডেট ==

নীচে @ জনম্যাচিনের মন্তব্য অনুসরণ করে, আমি আমার স্ক্রিপ্টে এই লাইনগুলি যুক্ত করার চেষ্টা করেছি:

print repr(open(filepath, 'rb').read(200)) # dump 1st 200 bytes of file
data = open(filepath, 'rb').read()
print data.find('\x00')
print data.count('\x00')

এবং এটি আমি পেয়েছি আউটপুট:

'\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1\x00\x00\x00\x00\x00\x00\x00\x00\ .... <snip>
8
13834

সুতরাং ফাইলটি আসলে NUL বাইট থাকে না।


od -cপ্রথম লাইনের মতো দেখতে কী বলে?
Ignacio Vazquez-Abram

আমার কী ক্যোয়ারী চালানো উচিত, বিড়াল মাই সিএসভি এর মতো কিছু od -c | আরও? তার সাথে আমি পেয়েছি: 0000000 ডি এপার্টমেন্টে এফ
এমিল

সিএসভি কীভাবে উত্পন্ন হয়? এক্সেল থেকে, আপনি একটি উপভাষা চেষ্টা করতে সক্ষম হতে পারেন। : তা না হলে বলে তাকান stackoverflow.com/questions/2753022/...
ড jimbob

ধন্যবাদ। এটি আমার সিএসভি নয় এবং দুর্ভাগ্যক্রমে আমার এটিকে পরিবর্তন করার শক্তি নেই। আমি মনে করি এটি এক্সেল হিসাবে তৈরি হয়েছে এবং সিএসভি (বুও) হিসাবে সংরক্ষিত হয়েছে। একটি উপভাষা একটি ভাল ধারণা বলে মনে হচ্ছে - আমি চেষ্টা করব!
এপি 257

যদি এটি আসলে CSV হিসাবে সংরক্ষণ করা হয় তবে এটি কাজ করা উচিত। আমার মাঝে মাঝে একটি জিনিস টিএসভি (ট্যাব বিচ্ছিন্ন) ফাইলগুলি CSV হিসাবে মাস্ক্রেড করা হয়, যাতে আপনি '\ t' এর একটি ডিলিমিটার সেট করার চেষ্টা করতে পারেন। যদি এটি এক্সেল ফাইল হিসাবে সংরক্ষণ করা হয় এবং এক্সটেনশনটি সিএসভিতে পরিবর্তিত হয় তবে কোনও উপভাষা কাজ করবে না। আমি মনে করি সেই ক্ষেত্রে আপনার একমাত্র বিকল্প হ'ল এক্সেলকে যথাযথ সিএসভি হিসাবে অনুলিপিগুলি সংরক্ষণ করতে ব্যবহার করা।
থমাস কে

উত্তর:


104

@ এস.লোট যেমন বলেছেন, আপনার ফাইলগুলি 'আরবি' মোডে খুলতে হবে, 'আরইউ' মোডে নয়। তবে এটি আপনার বর্তমান সমস্যার কারণ হতে পারে না। যতদূর আমি জানি, 'আরইউ' মোড ব্যবহার \rকরে ডেটা এম্বেড করা থাকলে আপনাকে বিভ্রান্ত করবে , তবে অন্য কোনও নাটক তৈরির কারণ হবে না। আমি আরও লক্ষ করি যে আপনার বেশ কয়েকটি ফাইল রয়েছে (সমস্ত 'rU' দিয়ে খোলা হয়েছে) তবে সমস্যাগুলির মধ্যে কেবল একটি।

যদি সিএসভি মডিউলটি বলে যে আপনার ফাইলে একটি "নুল" (নির্বোধ বার্তা, "NUL") হওয়া উচিত, তবে আপনার ফাইলটিতে কী আছে তা পরীক্ষা করে দেখার দরকার। আমি পরামর্শ দিচ্ছি যে আপনি 'rb' ব্যবহার করে সমস্যাটি দূরে সরিয়ে দিলেও আপনি এটি করেন।

repr()আপনার ডিবাগিং বন্ধু (বা হতে চায়)। এটি একটি প্ল্যাটফর্মের স্বতন্ত্র ফ্যাশনে (যা কী odবা কী করছে তা অবগত নয় এমন সহায়তাকারীদের পক্ষে সহায়ক) যা আপনি পেয়েছেন তা নির্বিঘ্নে প্রদর্শন করবে । এটা কর:

print repr(open('my.csv', 'rb').read(200)) # dump 1st 200 bytes of file

এবং সাবধানতার সাথে ফলাফলটি আপনার প্রশ্নের সম্পাদনায় (কোনও মন্তব্যে নয়) অনুলিপি করুন (পুনরায় টাইপ করবেন না)।

আরও মনে রাখবেন যে ফাইলটি যদি সত্যই দুর্বল হয় যেমন ফাইলের শুরু থেকে যুক্তিসঙ্গত দূরত্বের মধ্যে কোনও \ r বা \ n না, তবে উল্লিখিত লাইন নম্বরটি reader.line_numহবে (অপ্রয়োজনীয়ভাবে) ১. প্রথমটি \x00কোথায় (যদি থাকে) কোথায় তা আবিষ্কার করুন

data = open('my.csv', 'rb').read()
print data.find('\x00')

এবং নিশ্চিত হয়ে নিন যে আপনি কমপক্ষে এমন অনেকগুলি বাইটকে রেপ বা ওড দিয়ে ফেলেছেন।

কি data.count('\x00')বলে? যদি অনেকগুলি থাকে তবে আপনি এমন কিছু করতে চাইতে পারেন

for i, c in enumerate(data):
    if c == '\x00':
        print i, repr(data[i-30:i]) + ' *NUL* ' + repr(data[i+1:i+31])

যাতে আপনি প্রসঙ্গে NUL বাইটগুলি দেখতে পান।

যদি আপনি \x00আউটপুটে (বা \0আপনার od -cআউটপুটে) দেখতে পান তবে অবশ্যই আপনার অবশ্যই ফাইলটিতে NUL বাইট রয়েছে, এবং আপনাকে এরকম কিছু করতে হবে:

fi = open('my.csv', 'rb')
data = fi.read()
fi.close()
fo = open('mynew.csv', 'wb')
fo.write(data.replace('\x00', ''))
fo.close()

যাইহোক, আপনি কোনও পাঠ্য সম্পাদক দিয়ে ফাইলটি (শেষ কয়েকটি লাইন সহ) দেখেছেন? এটি কি অন্যান্য (কোনও "NULL বাইট" ব্যতিক্রম নয়) ফাইলগুলির মতো যুক্তিসঙ্গত সিএসভি ফাইলের মতো দেখাচ্ছে?


এই খুব বিস্তারিত সাহায্যের জন্য আপনাকে অনেক ধন্যবাদ। ফাইলে প্রচুর 00 x00 অক্ষর রয়েছে (প্রশ্নে সম্পাদনা দেখুন) - এটি অদ্ভুত, কারণ কোনও পাঠ্য সম্পাদক এ এটি একেবারে যুক্তিসঙ্গত সিএসভি ফাইলের মতো দেখায়।
এপি 257

1
@ এপি 257: '\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1এটি একটি "স্বাক্ষর" যা একটি ওএইলআই 2 যৌগিক নথি ফাইলকে বোঝায় - যেমন একটি এক্সেল 97-2003 .এক্সএলএস ফাইল । আমি খুঁজে "একটি পুরোপুরি যুক্তিসঙ্গত CSV ফাইল মত একটি টেক্সট এডিটর দেখে মনে হচ্ছে এ" হতে একদম অবিশ্বাস্য । আপনি অবশ্যই অন্য কোনও ফোল্ডারে বা অন্য কোনও মেশিনে বা অন্য কোনও সময়ে কোনও বৈধ ফাইল, একটি বৈধ সিএসভি ফাইলের দিকে নজর রেখেছেন। মনে রাখবেন যে আপনার odআউটপুটটি কোনও এক্সএলএস ফাইল থেকে ছিল না।
জন মাচিন

8
@ এপি 257: কোনও নির্দিষ্ট কারণ আপনি এই উত্তরটি গ্রহণ করেন নি?
জন মাচিন

কাজ করে, তবে সিএসভি ফিল্টার করে এবং csv.readerসরাসরি চলে যেতে পারে এমন একটি ফাইল-জাতীয় অবজেক্টের সাথে ফ্লাই-এ সম্ভব এবং দুর্দান্ত হওয়া উচিত ।
অঙ্কুরিত

1
না করা উচিত fo.write(data.replace('\x00', ''))হবে fo.write(data.replace(b'\x00', b''))? পাইথন এখানে
6.6

23
data_initial = open("staff.csv", "rb")
data = csv.reader((line.replace('\0','') for line in data_initial), delimiter=",")

এটি আমার পক্ষে কাজ করে।


আমার ক্ষেত্রে সমাধান করা, নাল হ'ল '\ 0' মান। ধন্যবাদ।
মেন্ডেস

19

এটি ইউটিএফ -16 হিসাবে পড়া আমার সমস্যাও ছিল।

আমার কোডটি এখানে কাজ শেষ করেছে:

f=codecs.open(location,"rb","utf-16")
csvread=csv.reader(f,delimiter='\t')
csvread.next()
for row in csvread:
    print row

যেখানে অবস্থানটি আপনার সিএসভি ফাইলের ডিরেক্টরি।


13

আমিও এই সমস্যায় পড়েছি। পাইথন csvমডিউলটি ব্যবহার করে , আমি এমএস এক্সেলে তৈরি করা একটি এক্সএলএস ফাইল পড়ার চেষ্টা করছিলাম এবং NULL byteআপনি যে ত্রুটিটি পেয়ে যাচ্ছিলেন তা চালিয়ে যাচ্ছিলাম । আমি এমএসএল এক্সেল স্প্রেডশিট ফাইলগুলি থেকে ডেটা পড়ার এবং ফর্ম্যাট করার জন্য xlrd পাইথন মডিউলটি পেয়েছিলাম। সঙ্গে xlrdমডিউল, আমি না শুধুমাত্র ফাইল সঠিকভাবে পড়তে সক্ষম, কিন্তু আমি একটি উপায় আমি আগে না পারা ফাইল বিভিন্ন অংশের অ্যাক্সেস করতে পারেন।

আমি ভেবেছিলাম এটি আপনাকে সাহায্য করতে পারে।


7
যে মডিউলটি নির্দেশ করার জন্য ধন্যবাদ। আকর্ষণীয়ভাবে যথেষ্ট, আমি এটি ডাউনলোড করতে গিয়েছিলাম এবং লক্ষ্য করেছি যে লেখক @ জন_ম্যাচিন ছাড়া আর কেউ ছিলেন না যিনি এই প্রশ্নের শীর্ষ মন্তব্যও ছিলেন।
ইভান

11

উত্স ফাইলের এনকোডিংটি ইউটিএফ -16 থেকে ইউটিএফ -8 এ রূপান্তর করা আমার সমস্যার সমাধান করে।

পাইথনে কোনও ফাইলকে utf-8 এ কীভাবে রূপান্তর করবেন?

import codecs
BLOCKSIZE = 1048576 # or some other, desired size in bytes
with codecs.open(sourceFileName, "r", "utf-16") as sourceFile:
    with codecs.open(targetFileName, "w", "utf-8") as targetFile:
        while True:
            contents = sourceFile.read(BLOCKSIZE)
            if not contents:
                break
            targetFile.write(contents)

7

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

with open(filepath, "rb") as f:
    reader = csv.reader( (line.replace('\0','') for line in f) )

    try:
        for row in reader:
            print 'Row read successfully!', row
    except csv.Error, e:
        sys.exit('file %s, line %d: %s' % (filename, reader.line_num, e))

2

তুমি কেন এটা করছ?

 reader = csv.reader(open(filepath, "rU"))

দস্তাবেজগুলি সম্পূর্ণ পরিষ্কার যে আপনার অবশ্যই এটি করতে হবে:

with open(filepath, "rb") as src:
    reader= csv.reader( src )

মোডটি পড়তে হবে "আরবি"।

http://docs.python.org/library/csv.html#csv.reader

Csvfile যদি কোনও ফাইল অবজেক্ট হয় তবে এটি অবশ্যই প্ল্যাটফর্মগুলিতে 'বি' পতাকা সহ খোলার দরকার যেখানে এটি কোনও পার্থক্য করে।


@ এপি 257: "সাহায্য করে না"? মানে কি? কোন নির্দিষ্ট ত্রুটি বার্তা?
এস .লট

1
@ এসলট: এর অর্থ তিনি আগের মতোই উত্তর পেয়েছেন। বাস্তবতাটি হ'ল তিনি একটি গিরগিটি বা শাপিশিফটার ফাইলটি নিয়ে কাজ করছেন ... যখন তিনি এটিকে ফেলা odবা পাঠ্য সম্পাদক এ এটিকে দেখেন তখন এটি দেখতে একেবারে সাধারণ সিএসভি ফাইলের মতো লাগে। তবে যখন তিনি পাইথন রিপ্রার () এর সাথে প্রথম কয়েকটি বাইট ছুঁড়ে ফেলেন তখন এটি একটি এক্সেল। এক্সএলএস ফাইলের (যেমনটি সিএসভি এক্সটেনশন হিসাবে নামকরণ করা হয়েছে) তৈরি করে।
জন মাচিন

@ জন ম্যাকিন: "একটি এক্সেল। এক্সএলএস ফাইল (এটি একটি সিএসভি এক্সটেনশন হিসাবে নামকরণ করা হয়েছে" বোঝায় যে এটি
কোনওক্রমে

1
@ এস.লট: এই বিষয়বস্তুর সাথে, এটি বোঝায় যে সিএসভি মডিউলটি এটি প্রক্রিয়া করতে পারে না; তবে xlrd মডিউল এটি প্রক্রিয়া করতে পারে। সম্ভবত, ইনপুট ফাইলের নাম থেকে কোনও মডিউল কিছুই অনুমান করে না, যদি সত্যই ইনপুটটি কোনও নামযুক্ত কোনও ফাইল হয়।
জন মাচিন

1
@ জন মাচিন: "মডিউল দুটিই ইনপুট ফাইলের নাম থেকে কিছুই অনুমান করে না"। সত্য। আমার আবেদনের কাঠামো সেই সত্যের উপর নির্ভর করে। লোকেদের ভুল করা ("মিথ্যা") যেহেতু আমরা ফাইলের নামটি কোনও অর্থ বোঝাতে বিশ্বাস করি না। সুতরাং আমাদের ক্লিক না করা অবধি বিকল্পগুলির একটি গুচ্ছ পরীক্ষা করতে হবে।
এস .লট

2

স্পষ্টতই এটি একটি এক্সএলএস ফাইল এবং http://www.garykessler.net/library/file_sigs.html নিশ্চিত হিসাবে একটি সিএসভি ফাইল নয়


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

এই ম্যাজিক নম্বরটি দিয়ে এটি XLSX এর আলাদা ম্যাজিক সংখ্যা রয়েছে
জাভিয়ের কমবেল

2

সিএসভি রিডারের পরিবর্তে আমি স্ট্রিংয়ের জন্য পঠন ফাইল এবং বিভক্ত ফাংশন ব্যবহার করি:

lines = open(input_file,'rb') 

for line_all in lines:

    line=line_all.replace('\x00', '').split(";")

1

আমি একই ত্রুটি পেয়েছি। ইউটিএফ -8 এ ফাইলটি সংরক্ষণ করে এবং এটি কাজ করে।


1
আপনি একই ত্রুটি বার্তা পেয়েছেন তবে কারণটি অন্যরকম হতে পারে - আপনি সম্ভবত এটি মূলত ইউটিএফ -16 (নোটপ্যাডকে "ইউনিকোড" বলে) হিসাবে সংরক্ষণ করেছেন।
জন মাচিন

1

আমি যখন ওপেনঅফিস ক্যালকের সাথে একটি সিএসভি ফাইল তৈরি করেছি তখন আমার সাথে এটি ঘটেছিল। আমার পাঠ্য সম্পাদকটিতে CSV ফাইলটি তৈরি করার পরে এটি ঘটেনি, এমনকি পরে আমি এটি ক্যালকের মাধ্যমে সম্পাদনা করেছি।

আমি আমার টেক্সট এডিটরে আমার ক্যালক-তৈরি ফাইল থেকে নতুন সম্পাদক-তৈরি করা ফাইলটিতে ডেটা অনুলিপি করে আমার সমস্যার সমাধান করেছি।


1

খালি শিরোনামগুলিতে NULL বাইট সন্নিবেশ করানো এমন একটি ওয়েবসার্ভিস থেকে উত্পাদিত সিএসভি খোলতে আমার একই সমস্যা হয়েছিল। ফাইলটি পরিষ্কার করার জন্য আমি নিম্নলিখিতটি করেছি:

with codecs.open ('my.csv', 'rb', 'utf-8') as myfile:
    data = myfile.read()
    # clean file first if dirty
    if data.count( '\x00' ):
        print 'Cleaning...'
        with codecs.open('my.csv.tmp', 'w', 'utf-8') as of:
            for line in data:
                of.write(line.replace('\x00', ''))

        shutil.move( 'my.csv.tmp', 'my.csv' )

with codecs.open ('my.csv', 'rb', 'utf-8') as myfile:
    myreader = csv.reader(myfile, delimiter=',')
    # Continue with your business logic here...

অস্বীকৃতি: সাবধান থাকুন যে এটি আপনার মূল ডেটাটিকে ওভাররাইট করে। এটির একটি ব্যাকআপ কপি আপনার কাছে রয়েছে তা নিশ্চিত করুন। তোমাকে সতর্ক করা হইছে!


0

এই সমস্ত 'আরইউ' ফাইলমোড বিদ্বেষীদের জন্য: আমি একটি ম্যাকের উইন্ডোজ মেশিন থেকে 'আরবি' ফাইলমোড দিয়ে একটি সিএসভি ফাইল খোলার চেষ্টা করেছি এবং সিএসভি মডিউলটি থেকে আমি এই ত্রুটিটি পেয়েছি:

Error: new-line character seen in unquoted field - do you need to 
open the file in universal-newline mode?

'RU' মোডে ফাইলটি খোলার কাজটি ভাল কাজ করে। আমি সর্বজনীন-নিউলাইন মোড পছন্দ করি - এটি আমাকে এত ঝামেলা বাঁচায়।


0

স্ক্র্যাপি ব্যবহার করার সময় এবং সিএসভ্রেডারের কাছে হস্তান্তর করার আগে প্রতিক্রিয়া বডিটি আনজিপ করার জন্য সঠিক মিডলওয়্যার না রেখে একটি জিপড সিএসভিফাইলে আনার সময় আমি এর মুখোমুখি হয়েছিলাম। সুতরাং ফাইলটি আসলেই কোনও সিএসভি ফাইল ছিল না এবং line contains NULL byteতদনুযায়ী ত্রুটিটি ছুঁড়েছে ।


0

আপনি gzip.open ব্যবহার করার চেষ্টা করেছেন?

with gzip.open('my.csv', 'rb') as data_file:

আমি এমন একটি ফাইল খোলার চেষ্টা করছিলাম যা সংকুচিত হয়েছিল তবে 'csv.gz' এর পরিবর্তে '.csv' এক্সটেনশন ছিল। আমি gzip.open ব্যবহার না করা পর্যন্ত এই ত্রুটিটি প্রদর্শিত থাকবে


-1

একটি কেস হ'ল - যদি সিএসভি ফাইলে খালি সারি থাকে তবে এই ত্রুটিটি প্রদর্শিত হতে পারে। আমরা লিখতে বা পড়তে যাওয়ার আগে সারি পরীক্ষা করা প্রয়োজন।

for row in csvreader:
        if (row):       
            do something

কোডটিতে এই চেকটি যুক্ত করে আমি আমার সমস্যার সমাধান করেছি।

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