পাইথনের সাথে পান্ডাসে সিএসভি ফাইল পড়ার সময় ইউনিকোড ডিকোডেরর ror


412

আমি এমন একটি প্রোগ্রাম চালাচ্ছি যা ৩০,০০০ অনুরূপ ফাইল প্রসেস করছে। তাদের মধ্যে এলোমেলো সংখ্যক এই ত্রুটিটি থামছে এবং উত্পাদন করছে ...

   File "C:\Importer\src\dfman\importer.py", line 26, in import_chr
     data = pd.read_csv(filepath, names=fields)
   File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 400, in parser_f
     return _read(filepath_or_buffer, kwds)
   File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 205, in _read
     return parser.read()
   File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 608, in read
     ret = self._engine.read(nrows)
   File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 1028, in read
     data = self._reader.read(nrows)
   File "parser.pyx", line 706, in pandas.parser.TextReader.read (pandas\parser.c:6745)
   File "parser.pyx", line 728, in pandas.parser.TextReader._read_low_memory (pandas\parser.c:6964)
   File "parser.pyx", line 804, in pandas.parser.TextReader._read_rows (pandas\parser.c:7780)
   File "parser.pyx", line 890, in pandas.parser.TextReader._convert_column_data (pandas\parser.c:8793)
   File "parser.pyx", line 950, in pandas.parser.TextReader._convert_tokens (pandas\parser.c:9484)
   File "parser.pyx", line 1026, in pandas.parser.TextReader._convert_with_dtype (pandas\parser.c:10642)
   File "parser.pyx", line 1046, in pandas.parser.TextReader._string_convert (pandas\parser.c:10853)
   File "parser.pyx", line 1278, in pandas.parser._string_box_utf8 (pandas\parser.c:15657)
 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xda in position 6: invalid    continuation byte

এই ফাইলগুলির উত্স / সৃষ্টি সমস্ত একই জায়গা থেকে আসে। আমদানি নিয়ে এগিয়ে যাওয়ার জন্য এটি সংশোধন করার সর্বোত্তম উপায় কোনটি?

উত্তর:


821

read_csvencodingবিভিন্ন বিন্যাসে ফাইল মোকাবেলা করতে একটি বিকল্প গ্রহণ করে takes আমি বেশিরভাগ ক্ষেত্রে read_csv('file', encoding = "ISO-8859-1"), বা বিকল্পভাবে encoding = "utf-8"পড়ার জন্য এবং সাধারণত utf-8ব্যবহার করি to_csv

আপনি এর পরিবর্তে একাধিক aliasবিকল্পের মধ্যে একটি ব্যবহার করতে পারেন ( পাইথন ডক্স দেখুন , আপনি দেখতে পাচ্ছেন এমন অনেকগুলি এনকোডিংয়ের জন্যও)।'latin''ISO-8859-1'

দেখুন প্রাসঙ্গিক পান্ডাস ডকুমেন্টেশন , CSV ফাইল পাইথন ডক্স উদাহরণ , ইত্যাদি এখানে সম্পর্কিত প্রশ্নের প্রচুর। একটি ভাল ব্যাকগ্রাউন্ড রিসোর্স হ'ল ইউনিকোড এবং চরিত্রের সেট সম্পর্কে প্রতিটি বিকাশকারীকে যা জানা উচিত

এনকোডিং সনাক্ত করার জন্য (ধরে নিচ্ছেন যে ফাইলটিতে অ-এসকিআই অক্ষর রয়েছে) আপনি ব্যবহার করতে পারেন enca( ম্যান পৃষ্ঠা দেখুন ) বা file -i(লিনাক্স) বা file -I(অসক্স) ( ম্যান পৃষ্ঠাটি দেখুন )।


7
যেহেতু এটি একটি উইন্ডোজ ইস্যু, তাই cp1252এটি পছন্দনীয় হতে পারে iso-8859-1
tzot

7
ধন্যবাদ pd.read_csv('immigration.csv', encoding = "ISO-8859-1", engine='python')আমার জন্য কাজ করেছে
মোনা জালাল

8
কোনও ব্যতিক্রম ছুঁড়ে দেওয়া হয়নি বলে অন্ধভাবে কোনও নির্দিষ্ট এনকোডিংটি সঠিক বলে মনে করবেন না। আপনার স্ট্রিংগুলি দেখতে হবে এবং ব্যাখ্যাটি অর্থবোধ করে কিনা তা বের করার প্রয়োজন। উদাহরণস্বরূপ, আপনি যদি "হর্স ডি'উভ্রে" এর পরিবর্তে "হর্স ডি'উভ্রে" পান তবে আপনাকে সম্ভবত আইএসও -8859-1 থেকে আইএসও -8859-15 এ স্যুইচ করতে হবে।
জোছিম ওয়াগনার

6
আমার জন্য এনকোডিং ছিল ANSI। এটি চিত্রিত করার জন্য, আমি সিএসভিটি খুললাম notepadতারপরে ক্লিক করুন save as, সেখানে এটি সংরক্ষণ বোতামের পাশে এনকোডিং দেখায়।
বৈভব বিশাল


68

সকল সমাধানগুলির মধ্যে সবচেয়ে সহজ:

import pandas as pd
df = pd.read_csv('file_name.csv', engine='python')

বিকল্প সমাধান:

  • সাব্লাইম টেক্সট এডিটরে সিএসভি ফাইলটি খুলুন ।
  • ফাইলটি utf-8 ফর্ম্যাটে সংরক্ষণ করুন।

মহাকাশে, ফাইলটি ক্লিক করুন -> এনকোডিং সহ সংরক্ষণ করুন -> ইউটিএফ -8

তারপরে, আপনি যথারীতি আপনার ফাইলটি পড়তে পারেন:

import pandas as pd
data = pd.read_csv('file_name.csv', encoding='utf-8')

এবং অন্যান্য বিভিন্ন এনকোডিং প্রকার:

encoding = "cp1252"
encoding = "ISO-8859-1"

11
প্রশ্নটি ব্যাখ্যা করে যে এখানে 30,000 টি ফাইল রয়েছে। প্রতিটি ফাইল ম্যানুয়ালি খোলানো ব্যবহারিক হবে না।
কিথ

4
কমপক্ষে একটি ফাইলের জন্য, এটি আমার পক্ষে কাজ করবে বলে মনে হয়েছিল!
apil.tamang

সি ইঞ্জিন স্পষ্টতই এটি যা গ্রহণ করে তাতে আরও ক্ষমাশীল। কোনও নির্দিষ্ট সিএসভি ফাইলের জন্য যা থ্রো encoding='iso-8859-1'ব্যবহার করে সূক্ষ্মভাবে খোলে । engine='python'_csv.Error: field larger than field limit (131072)
গ্রেগ বেকন

1
এনকোডিং সহ সেভ ব্যবহারের বিকল্প সমাধানটি সত্যিই সহায়ক ছিল! এখানে কিভাবে জন্য VSCode এটি ব্যবহার করার stackoverflow.com/questions/30082741/...
brownmagik352

20

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

  1. আপনি এনকোডিং জানেন, এবং ফাইলটিতে কোনও এনকোডিং ত্রুটি নেই। দুর্দান্ত: আপনার কাছে কেবল এনকোডিং নির্দিষ্ট করতে হবে:

    file_encoding = 'cp1252'        # set file_encoding to the file encoding (utf8, latin1, etc.)
    pd.read_csv(input_file_and_path, ..., encoding=file_encoding)
  2. আপনি এনকোডিং প্রশ্নগুলির সাথে উদ্বিগ্ন হতে চান না, এবং কেবলমাত্র এই জঘন্য ফাইলটি লোড করার জন্য চান, কিছু পাঠ্য ক্ষেত্রে ময়লা আবশ্যক না কেন। ঠিক আছে, আপনাকে কেবল Latin1এনকোডিং ব্যবহার করতে হবে কারণ এটি যে কোনও সম্ভাব্য বাইটকে ইনপুট হিসাবে গ্রহণ করে (এবং এটি একই কোডের ইউনিকোড চরিত্রে রূপান্তর করে):

    pd.read_csv(input_file_and_path, ..., encoding='latin1')
  3. আপনি জানেন যে বেশিরভাগ ফাইল একটি নির্দিষ্ট এনকোডিং দিয়ে লেখা হয় তবে এতে এনকোডিং ত্রুটিও রয়েছে। আসল বিশ্বের উদাহরণ হ'ল একটি ইউটিএফ 8 ফাইল যা কোনও ইউটিএফ 8 সম্পাদক দ্বারা সম্পাদিত হয়েছিল এবং এতে আলাদা এনকোডিং সহ কিছু লাইন রয়েছে। openপান্ডসের একটি বিশেষ ত্রুটি প্রক্রিয়াজাতকরণের কোনও বিধান নেই তবে পাইথন ফাংশনটিতে ( পাইথন 3 অনুমান করে) রয়েছে এবং এটি read_csvকোনও বস্তুর মতো ফাইল গ্রহণ করে। এখানে ব্যবহার করার জন্য সাধারণ ত্রুটিগুলির প্যারামিটারগুলি হ'ল 'ignore'কেবল আক্রমণাত্মক বাইটগুলি বা (আইএমএইচও আরও ভাল) দমন করে 'backslashreplace'যা আপত্তিজনক বাইটগুলি তাদের পাইথনের ব্যাকস্ল্যাশ পালানোর ক্রম দ্বারা প্রতিস্থাপন করে:

    file_encoding = 'utf8'        # set file_encoding to the file encoding (utf8, latin1, etc.)
    input_fd = open(input_file_and_path, encoding=file_encoding, errors = 'backslashreplace')
    pd.read_csv(input_fd, ...)

1
দেরীতে উত্তর, কিন্তু একটি সদৃশ প্রশ্নের
লক্ষ্যবস্তু

14
with open('filename.csv') as f:
   print(f)

এই কোডটি কার্যকর করার পরে আপনি 'filename.csv' এর এনকোডিং দেখতে পাবেন তারপরে কোডটি নিম্নলিখিত হিসাবে কার্যকর করুন

data=pd.read_csv('filename.csv', encoding="encoding as you found earlier"

এই নাও


6

আমার ক্ষেত্রে, USC-2 LE BOMনোটপ্যাড ++ অনুযায়ী কোনও ফাইলের এনকোডিং রয়েছে । এটা encoding="utf_16_le"অজগর জন্য।

আশা করি, এটি কারওর জন্য কিছুটা দ্রুত উত্তর খুঁজে পেতে সহায়তা করে।


4

আমার ক্ষেত্রে এটি অজগর ২.7 এর জন্য কাজ করেছিল:

data = read_csv(filename, encoding = "ISO-8859-1", dtype={'name_of_colum': unicode}, low_memory=False) 

অজগর 3 এর জন্য, কেবলমাত্র:

data = read_csv(filename, encoding = "ISO-8859-1", low_memory=False) 

3

ইঞ্জিন = 'অজগর' উল্লেখ করার চেষ্টা করুন। এটি আমার পক্ষে কাজ করেছে তবে আমি কেন তা বোঝার চেষ্টা করছি।

df = pd.read_csv(input_file_path,...engine='python')

এটি আমার জন্যও কাজ করেছিল। এনকোডিং = "আইএসও -8859-1" হয়েছে। এটি অবশ্যই একটি এনকোডিং সমস্যা। যদি একটি বিশেষ অক্ষর এএনএসআই-তে যেমন একটি উপবৃত্তাকার চরিত্র (যেমন "...") তে এনকোড করা থাকে এবং আপনি এটি ইউটিএফ -8 এ পড়ার চেষ্টা করেন তবে আপনি একটি ত্রুটি পেতে পারেন। নীচের লাইনটি আপনার অবশ্যই জানা উচিত যে ফাইলটি এনকোডিং দিয়ে তৈরি হয়েছিল।
শান ম্যাকার্থি

3

এই সমস্যাটি কেন হতে পারে সে সম্পর্কে আমি একটি আপডেট সমাধান এবং ব্যাখ্যা প্রদানের জন্য একটি উত্তর পোস্ট করছি। বলুন আপনি কোনও ডেটাবেস বা এক্সেল ওয়ার্কবুক থেকে এই ডেটা পাচ্ছেন। যদি আপনার মতো বিশেষ অক্ষর La Cañada Flintridge cityথাকে তবে ভাল আপনি যদি UTF-8এনকোডিং ব্যবহার করে ডেটা রফতানি না করেন তবে আপনি ত্রুটিগুলি প্রবর্তন করতে যাচ্ছেন। La Cañada Flintridge cityহয়ে যাবে La Ca\xf1ada Flintridge city। আপনি যদি pandas.read_csvডিফল্ট প্যারামিটারগুলিতে কোনও সামঞ্জস্য না করে ব্যবহার করছেন তবে আপনি নীচের ত্রুটিটি আঘাত করবেন

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 5: invalid continuation byte

ভাগ্যক্রমে, কয়েকটি সমাধান রয়েছে।

বিকল্প 1 , রফতানি স্থির করুন। UTF-8এনকোডিং ব্যবহার করতে ভুলবেন না ।

বিকল্প 2 , যদি রফতানি সমস্যা সংশোধন করা আপনার কাছে না পাওয়া যায় এবং আপনার ব্যবহারের প্রয়োজন হয় pandas.read_csvতবে নীচের প্যারামিটারগুলি অবশ্যই অন্তর্ভুক্ত করবেন engine='python',। ডিফল্টরূপে, পান্ডাস ব্যবহার করে engine='C'যা বড় বড় পরিষ্কার ফাইলগুলি পড়ার জন্য দুর্দান্ত, তবে যদি অপ্রত্যাশিত কিছু আসে তবে ক্রাশ হবে। আমার অভিজ্ঞতায়, সেটিংটি encoding='utf-8'কখনই এটিকে ঠিক করে নি UnicodeDecodeError। এছাড়াও, আপনার ব্যবহার করার দরকার নেই errors_bad_lines, তবে এটি এখনও একটি বিকল্প যদি আপনার সত্যিই এটির প্রয়োজন হয়।

pd.read_csv(<your file>, engine='python')

বিকল্প 3: সমাধানটি ব্যক্তিগতভাবে আমার পছন্দসই সমাধান। ভ্যানিলা পাইথন ব্যবহার করে ফাইলটি পড়ুন।

import pandas as pd

data = []

with open(<your file>, "rb") as myfile:
    # read the header seperately
    # decode it as 'utf-8', remove any special characters, and split it on the comma (or deliminator)
    header = myfile.readline().decode('utf-8').replace('\r\n', '').split(',')
    # read the rest of the data
    for line in myfile:
        row = line.decode('utf-8', errors='ignore').replace('\r\n', '').split(',')
        data.append(row)

# save the data as a dataframe
df = pd.DataFrame(data=data, columns = header)

আশা করি এটি প্রথমবারের মতো এই সমস্যাটির মুখোমুখি লোকদের সহায়তা করবে।


2

কিছুক্ষন এটি নিয়ে সংগ্রাম করে ভেবেছিলাম যে এটি প্রথম অনুসন্ধানের ফলাফল হিসাবে আমি এই প্রশ্নটিতে পোস্ট করব। যোগ করার পদ্ধতি encoding="iso-8859-1"পান্ডাস করার ট্যাগ read_csvঅন্য কোন এনকোডিং কাজ করে নি, কিংবা করেনি, একটি UnicodeDecodeError দান রাখা।

আপনি একটি ফাইল হ্যান্ডেল পার করছি থাকলে pd.read_csv(),আপনি করা প্রয়োজন encoding, ফাইল খোলা উপর অ্যাট্রিবিউট নেই read_csv। অন্ধকারের দৃষ্টিতে স্পষ্ট, তবে ট্র্যাক করার জন্য একটি সূক্ষ্ম ত্রুটি।


1

এই উত্তরটি সিএসভি এনকোডিংয়ের সমস্যার পক্ষে ধরা পড়ে seems আপনি যদি নিজের শিরোনামটির সাথে একটি অদ্ভুত এনকোডিং সমস্যা পান তবে:

>>> f = open(filename,"r")
>>> reader = DictReader(f)
>>> next(reader)
OrderedDict([('\ufeffid', '1'), ... ])

তারপরে আপনার সিএসভি ফাইলের শুরুতে আপনার কাছে বাইট অর্ডার চিহ্ন (বিওএম) অক্ষর রয়েছে। এই উত্তরটি সমস্যার সমাধান করে:

পাইথন সিএসভি পড়ুন - বিওএম প্রথম কীটিতে এম্বেড হয়েছে

সমাধানটি এর সাথে সিএসভি লোড করা encoding="utf-8-sig":

>>> f = open(filename,"r", encoding="utf-8-sig")
>>> reader = DictReader(f)
>>> next(reader)
OrderedDict([('id', '1'), ... ])

আশা করি এটি কাউকে সাহায্য করবে।


1

আমি এই পুরানো থ্রেডে একটি আপডেট পোস্ট করছি। আমি একটি সমাধান পেয়েছি যা কাজ করেছে, তবে প্রতিটি ফাইল খোলার প্রয়োজন। আমি আমার csv ফাইলটি LibreOffice এ খুললাম, হিসাবে সংরক্ষণ করুন> ফিল্টার সেটিংস সম্পাদনা চয়ন করেছেন। ড্রপ-ডাউন মেনুতে আমি ইউটিএফ 8 এনকোডিংটি বেছে নিয়েছি। তারপর আমি যোগ encoding="utf-8-sig"করতে data = pd.read_csv(r'C:\fullpathtofile\filename.csv', sep = ',', encoding="utf-8-sig")

আশা করি এটি কাউকে সাহায্য করবে।


নিস, সম্পাদনার জন্য ধন্যবাদ। আপনি কি পরিবর্তন করেছেন দয়া করে ব্যাখ্যা করতে পারেন? আমি কোনও পার্থক্য দেখছি না।
tshirtdr1

1

একটি অনলাইন ব্যাংক থেকে ডাউনলোড করা সরলীকৃত চাইনিজগুলিতে একটি সিএসভি ফাইল খুলতে আমার সমস্যা হয়েছে, আমি চেষ্টা করেছি latin1, চেষ্টা করেছি iso-8859-1, চেষ্টা করেছি cp1252, সবই লাভ হয়নি।

কিন্তু pd.read_csv("",encoding ='gbk')সহজভাবে কাজ করে।


1

যোগ করার চেষ্টা করুন

encoding='unicode_escape'

এইটা সাহায্য করবে. আমার জন্য কাজ করেছেন। এছাড়াও, নিশ্চিত করে নিন যে আপনি সঠিক ডিলিমিটার এবং কলামের নাম ব্যবহার করছেন।

আপনি দ্রুত ফাইলটি লোড করতে মাত্র 1000 সারি লোড দিয়ে শুরু করতে পারেন।


0

আমি জুপিটার-নোটবুক ব্যবহার করছি। এবং আমার ক্ষেত্রে এটি ফাইলটিকে ভুল ফর্ম্যাটে দেখাচ্ছে। 'এনকোডিং' বিকল্পটি কাজ করছে না। সুতরাং আমি সিএসভিটিকে utf-8 ফর্ম্যাটে সংরক্ষণ করি এবং এটি কাজ করে।


0

এটা চেষ্টা কর:

import pandas as pd
with open('filename.csv') as f:
    data = pd.read_csv(f)

দেখে মনে হচ্ছে এটি আর্গুমেন্টের মাধ্যমে স্পষ্টভাবে প্রকাশ না করেই এনকোডিংয়ের যত্ন নেবে


0

পান্ডায় যাওয়ার আগে এনকোডিংটি পরীক্ষা করে দেখুন। এটি আপনাকে ধীর করবে, কিন্তু ...

with open(path, 'r') as f:
    encoding = f.encoding 

df = pd.read_csv(path,sep=sep, encoding=encoding)

পাইথনে ৩.7


0

আরেকটি গুরুত্বপূর্ণ সমস্যা যার মুখোমুখি হয়েছিলাম যার ফলে একই ত্রুটি হয়েছিল:

_values = pd.read_csv("C:\Users\Mujeeb\Desktop\file.xlxs")

Line এই লাইনটি একই ত্রুটির কারণ হয়েছিল কারণ আমি read_csv()পদ্ধতি ব্যবহার করে একটি এক্সেল ফাইল পড়ছি । read_excel().Xlxs পড়ার জন্য ব্যবহার করুন


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

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