_csv.Error: ক্ষেত্রের সীমা থেকে বড় ক্ষেত্র (131072)


232

আমার কাছে খুব বিশাল ক্ষেত্র সহ একটি সিএসভি ফাইলে একটি স্ক্রিপ্ট পড়া হচ্ছে:

# example from http://docs.python.org/3.3/library/csv.html?highlight=csv%20dictreader#examples
import csv
with open('some.csv', newline='') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

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

_csv.Error: field larger than field limit (131072)

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


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

1
আমি আমার প্রশ্নটি আপডেট করেছিলাম তা বোঝাতে যে আমার ক্ষেত্রে বিশাল ক্ষেত্র হতে পারে। সিএসভি ফাইলে কোনও খারাপ ডেটা নেই।
ব্যবহারকারী 1251007

1
@ ডাস্টম্যাচাইন এই জাতীয় জিনিসগুলি ঘটে কারণ কখনও কখনও আপনি দেখতে পাবেন যে লোকেরা ডাটাবেস সারণিতে বেস 64 এর ফর্ম্যাটে চিত্র (বা অন্যান্য বাইনারি ফাইলগুলি) সংরক্ষণ করে।
'17

উত্তর:


315

সিএসভি ফাইলটিতে খুব বিশাল ক্ষেত্র থাকতে পারে, সুতরাং এইগুলি বাড়ান field_size_limit:

import sys
import csv

csv.field_size_limit(sys.maxsize)

sys.maxsizeপাইথন 2.x এবং 3.x এর জন্য কাজ করে sys.maxintপাইথন ২.x এর সাথে কেবল কাজ করবে ( এসও: কী-সিস-ম্যাক্সিন্ট-ইন-পাইথন -৩ )

হালনাগাদ

জিওফ হিসাবে নির্দিষ্ট, উপরের কোড নিম্নলিখিত ত্রুটির ফলে পারে: OverflowError: Python int too large to convert to C long। এটির জন্য, আপনি নিম্নলিখিত দ্রুত এবং নোংরা কোডটি ব্যবহার করতে পারেন (যা পাইথন 2 এবং পাইথন 3 সহ প্রতিটি সিস্টেমে কাজ করা উচিত):

import sys
import csv
maxInt = sys.maxsize

while True:
    # decrease the maxInt value by factor 10 
    # as long as the OverflowError occurs.

    try:
        csv.field_size_limit(maxInt)
        break
    except OverflowError:
        maxInt = int(maxInt/10)

14
পাইথন ২.6 সহ উইন্ডোজ 64৪ বিবিটিতে, কল করার সময় ফলাফল maxInt = sys.maxsizeআসে । মজার বিষয় হল, ব্যবহার করা এটি পরিবর্তন করে না। একটি অপরিশোধিত কাজ হ'ল সিম্পলি ব্যবহার যা অন্যান্য প্ল্যাটফর্মগুলিতে অবশ্যই সমস্যা সৃষ্টি করে। আমার ক্ষেত্রে এটি সিএসভিতে ভাঙা মূল্য চিহ্নিত করতে, অন্য অ্যাপ্লিকেশনটিতে রফতানির বিকল্পগুলি ঠিক করতে এবং প্রয়োজনীয়তা সরিয়ে ফেলতে অনুরোধ করেছিল । 9223372036854775807LTypeError: limit must be an integercsv.field_size_limit(maxInt)maxInt = int(sys.maxsize)csv.field_size_limit(2147483647)csv.field_size_limit()
রোস্কাকোরি

আপনাকে এর জন্য অনেক ধন্যবাদ, ive বহু বছর ধরে এই বাগটি বের করার চেষ্টা করছিল!
কেভিন হার্নান্দেজ

152

এটি হতে পারে কারণ আপনার সিএসভি ফাইলটি একক বা ডাবল উদ্ধৃতি এম্বেড করেছে। যদি আপনার সিএসভি ফাইলটি ট্যাব-সীমিত হয় তবে এটিকে খোলার চেষ্টা করুন:

c = csv.reader(f, delimiter='\t', quoting=csv.QUOTE_NONE)

1
ধন্যবাদ!! আপনি যদি সিএসভিকিট (একটি দুর্দান্ত পাইথন গ্রন্থাগার এবং কমান্ড-লাইন সিএসভি টুলকিট) ব্যবহার করছেন এবং আসল ত্রুটিটি পান কারণ আপনার ফাইলটি ভারসাম্যহীন একক বা ডাবল উদ্ধৃতি ব্যবহার করে, আপনি -u 3কমান্ড লাইন বিকল্পের মাধ্যমে QUOTE_NONE নির্বাচন করতে পারেন , ওরফে--quoting 3
নীলামকবি

22

নীচে বর্তমান সীমা পরীক্ষা করা হয়

csv.field_size_limit()

আউট [20]: 131072

নীচে সীমা বাড়াতে হবে। এটি কোড যুক্ত করুন

csv.field_size_limit(100000000)

আবার সীমা পরীক্ষা করার চেষ্টা করুন

csv.field_size_limit()

[22] আউট: 100000000

এখন আপনি ত্রুটিটি পাবেন না "_csv.Error: ক্ষেত্রের সীমা থেকে বড় ক্ষেত্র (131072)"


15

CSV ক্ষেত্র মাপ মাধ্যমে নিয়ন্ত্রিত হয় CSV: [পাইথন 3.Docs]। ফিল্ড_সাইজ_লিমিট ( [নতুন_প্লিট] ) :

পার্সার দ্বারা অনুমোদিত বর্তমান সর্বাধিক ক্ষেত্রের আকার দেয়। যদি new_limit দেওয়া হয় তবে এটি নতুন সীমা হয়ে যায়।

এটি ডিফল্টরূপে 128 কে বা 0x20000 ( 131072 ) এ সেট করা হয়েছে , যা কোনও শালীন .csv এর জন্য পর্যাপ্ত হওয়া উচিত :

>>> import csv
>>>
>>> limit0 = csv.field_size_limit()
>>> limit0
131072
>>> "0x{0:016X}".format(limit0)
'0x0000000000020000'

যাইহোক, .csv ফাইলের সাথে ডিল করার সময় ( সঠিক উদ্ধৃতি এবং ডিলিমিটার সহ ) এই আকারের চেয়ে এক ফিল্ড দীর্ঘ (কমপক্ষে) থাকার পরে ত্রুটি পপ আপ হয়।
ত্রুটি থেকে মুক্তি পেতে, আকারের সীমাটি বাড়াতে হবে (কোনও উদ্বেগ এড়াতে সর্বোচ্চ সম্ভাব্য মান চেষ্টা করা উচিত)।

পর্দার আড়ালে (পরীক্ষা করুন [গিটহাব]: পাইথন / সিপিথন - (মাস্টার) সিপাইথন / মডিউল / _সিএসসি.সি বাস্তবায়নের বিশদ জন্য)) এই মানটি ধারণ করে এমন ভেরিয়েবল একটি সি দীর্ঘ ( [উইকিপিডিয়া]: সি ডাটা টাইপ ) যার আকার সিপিইউ আর্কিটেকচার এবং ওএস ( আই এল পি ) এর উপর নির্ভর করে পরিবর্তিত হয় । ধ্রুপদী পার্থক্য: একটি 64 বিট ওএসের জন্য ( পাইথন বিল্ড), দীর্ঘ টাইপের আকার ( বিটগুলিতে ):

  • নিক্স : 64
  • বিজয় : 32

এটি সেট করার চেষ্টা করার সময়, নতুন মানটি দীর্ঘ সীমানায় থাকার জন্য চেক করা হয় , এজন্য কিছু ক্ষেত্রে অন্য একটি ব্যতিক্রম পপ আপ হয় (এই ক্ষেত্রে উইনের ক্ষেত্রে সাধারণ ):

>>> import sys
>>>
>>> sys.platform, sys.maxsize
('win32', 9223372036854775807)
>>>
>>> csv.field_size_limit(sys.maxsize)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: Python int too large to convert to C long

এই সমস্যার মধ্যে দৌড়াতে এড়াতে, একটি আর্টিফিস ব্যবহার করে (সর্বাধিক সম্ভব) সীমাটি ( লং_ম্যাক্স ) সেট করুন ( [পাইথন ৩. ডকসকে ধন্যবাদ : সিটিপস - পাইথনের জন্য একটি বিদেশী ফাংশন লাইব্রেরি )। এটি যে কোনও সিপিইউ / ওএসে পাইথন 3 এবং পাইথন 2 এ কাজ করা উচিত ।

>>> import ctypes as ct
>>>
>>> csv.field_size_limit(int(ct.c_ulong(-1).value // 2))
131072
>>> limit1 = csv.field_size_limit()
>>> limit1
2147483647
>>> "0x{0:016X}".format(limit1)
'0x000000007FFFFFFF'

64bit পাইথন একটি উপর স্নো মত অপারেটিং সিস্টেম :

>>> import sys, csv, ctypes as ct
>>>
>>> sys.platform, sys.maxsize
('linux', 9223372036854775807)
>>>
>>> csv.field_size_limit()
131072
>>>
>>> csv.field_size_limit(int(ct.c_ulong(-1).value // 2))
131072
>>> limit1 = csv.field_size_limit()
>>> limit1
9223372036854775807
>>> "0x{0:016X}".format(limit1)
'0x7FFFFFFFFFFFFFFF'

জন্য 32bit পাইথন , জিনিষ অভিন্ন আছেন: এটা আচরণের উপর সম্মুখীন হচ্ছে উইন

আরও তথ্যের জন্য নিম্নলিখিত সংস্থানগুলি পরীক্ষা করুন:


2

একটি সাদামাটা সিএসভি ফাইলে আমার সবেমাত্র এটি ঘটেছিল। কিছু লোক এটিকে একটি অবৈধ ফর্ম্যাট ফাইল বলে call কোনও পালানোর অক্ষর নেই, কোনও ডাবল উদ্ধৃতি এবং ডিলিমিটারটি সেমিকোলন ছিল না।

এই ফাইলটি থেকে একটি নমুনা লাইন দেখতে এই রকম হবে:

প্রথম সেল; দ্বিতীয় "একটি ডাবল উদ্ধৃতি এবং শীর্ষস্থানীয় স্থান সহ ঘর; 'আংশিকভাবে উদ্ধৃত' ঘর; সর্বশেষ ঘর

দ্বিতীয় কক্ষে একক উদ্ধৃতি পার্সারটিকে তার রেল থেকে ফেলে দেবে। কি কাজ ছিল:

csv.reader(inputfile, delimiter=';', doublequote='False', quotechar='', quoting=csv.QUOTE_NONE)

1

কখনও কখনও, একটি সারিতে ডাবল উদ্ধৃতি কলাম থাকে। যখন সিএসভি পাঠক এই সারিটি পড়ার চেষ্টা করছেন, কলামের শেষ বোঝা গেল না এবং এই উত্থানটি চালিত করুন। সমাধান নীচে:

reader = csv.reader(cf, quoting=csv.QUOTE_MINIMAL)

0

আপনি ব্যবহার করতে পারেন read_csvথেকে pandasএই লাইন এড়িয়ে যেতে।

import pandas as pd

data_df = pd.read_csv('data.csv', error_bad_lines=False)

কোনও খারাপ লাইন নেই ... প্রশ্নে লেখা আছে: সিএসভি ফাইলগুলিতে বিশাল ক্ষেত্র রয়েছে এবং এই ডেটা বিশ্লেষণ করা দরকার।
ব্যবহারকারী 1251007

1
খারাপ লাইন ধারণার মধ্যে pandasসারিগুলি রয়েছে যা ক্ষেত্রের সীমা অতিক্রম করে csv। সুতরাং, আপনি যদি এই লাইনগুলি এড়িয়ে যেতে এবং অন্যান্য লাইনগুলি সফলভাবে পড়তে চান তবে আপনি এই সমাধানটি ব্যবহার করতে পারেন। অন্যথায়, যখন আপনার জন্য বিশাল ক্ষেত্র প্রয়োজন হয়, তখন ক্ষেত্রের সীমা বাড়ানো csv.field_size_limit(100000000)উপযুক্ত।
0x01

-1

সাধারণত .cassandra ডিরেক্টরিতে রাখা cqlshrc ফাইলটি সন্ধান করুন।

ফাইল সংযোজন,

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