اذهب إلى المحتوى

السؤال

نشر

أحاول قراءة العديد من ملفات csv باستخدام pandas لكن يظهر لي هذا الخطأ:

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

فما سببه وكيف يمكنني حله؟

Recommended Posts

  • 0
نشر

يظهر هذ الخطأ بسبب عدم قدرة pandas على فك التكويد encoding الخاص ببعض ملفات ال csv.

حيث أن read_csv تأخذ معامل parameter يدعي encoding ، وهو خاص بطريقة قراءة الملفات بشكل عام، ويكون في الأساس على القيمة "encoding = "utf-8 وهذا هو  الشائع لقراءة ملفات csv.

لحل تلك المشكلة ما عليك سوى ضبطها بطريقة يدوية كالتالي:

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

سيقوم هذا بفك مشكلة التشفير في الملفات التي يظهر بها الخطأ.

  • 0
نشر

الدالة read_csv تأخذ الوسيطة encoding للتعامل مع الملفات من مختلف التنسيقات. عندما نريد أن نحفظ شيئ ما كملف csv عادةً يستخدم الجميع utf-8 لكن ليس بالضرورة دوماً أن يكون تنسيقه utf-8 فقد يكون الملف تم حفظه بتنسيق آخر اوبالتالي إذا حاولت قراءته بالشكل التالي سيعطيك خطأ:

data = pd.read_csv('file_name.csv', encoding='utf-8') 
# أو
data = pd.read_csv('file_name.csv') 

لذا إذا كنت تعلم تنسيق الملف فقم بتمريره مباشرةً للوسيطة encoding وإذا لم تكن تعرف يجب أن تجرب بنفسك التنسيقات الأخرى:

import pandas as pd
data = pd.read_csv('file_name.csv', encoding = "ISO-8859-1")
# أو
data = pd.read_csv('file_name.csv', encoding = "cp1252")
# أو
data = pd.read_csv('file_name.csv', encoding = "latin1")

أحدهما يجب أن يعمل... هناك الكثير من التنسيقات الأخرى لكن نادري الاستخدام.

  • 0
نشر

كما في التعليقات السابقة فإنه المشكلة في ال encoding وفي حالة أنك لم تستطع معرفته يمكنك استخدام الكود التالي لمعرفته 

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

ثم بعد ذلك قم بتحديد ال encoding الذي وجدته 

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

كما أن إذا كنت تريد حل واحد لهذه المشكلة قم باستخدام ال Script التالي حيث يجرب الكثير من ال encoding واستخدام الصحيح

import pandas as pd

encoding_list = ['ascii', 'big5', 'big5hkscs', 'cp037', 'cp273', 'cp424', 'cp437', 'cp500', 'cp720', 'cp737'
                 , 'cp775', 'cp850', 'cp852', 'cp855', 'cp856', 'cp857', 'cp858', 'cp860', 'cp861', 'cp862'
                 , 'cp863', 'cp864', 'cp865', 'cp866', 'cp869', 'cp874', 'cp875', 'cp932', 'cp949', 'cp950'
                 , 'cp1006', 'cp1026', 'cp1125', 'cp1140', 'cp1250', 'cp1251', 'cp1252', 'cp1253', 'cp1254'
                 , 'cp1255', 'cp1256', 'cp1257', 'cp1258', 'euc_jp', 'euc_jis_2004', 'euc_jisx0213', 'euc_kr'
                 , 'gb2312', 'gbk', 'gb18030', 'hz', 'iso2022_jp', 'iso2022_jp_1', 'iso2022_jp_2'
                 , 'iso2022_jp_2004', 'iso2022_jp_3', 'iso2022_jp_ext', 'iso2022_kr', 'latin_1', 'iso8859_2'
                 , 'iso8859_3', 'iso8859_4', 'iso8859_5', 'iso8859_6', 'iso8859_7', 'iso8859_8', 'iso8859_9'
                 , 'iso8859_10', 'iso8859_11', 'iso8859_13', 'iso8859_14', 'iso8859_15', 'iso8859_16', 'johab'
                 , 'koi8_r', 'koi8_t', 'koi8_u', 'kz1048', 'mac_cyrillic', 'mac_greek', 'mac_iceland', 'mac_latin2'
                 , 'mac_roman', 'mac_turkish', 'ptcp154', 'shift_jis', 'shift_jis_2004', 'shift_jisx0213', 'utf_32'
                 , 'utf_32_be', 'utf_32_le', 'utf_16', 'utf_16_be', 'utf_16_le', 'utf_7', 'utf_8', 'utf_8_sig']

for encoding in encoding_list:
    worked = True
    try:
        df = pd.read_csv(path, encoding=encoding, nrows=5)
    except:
        worked = False
    if worked:
        print(encoding, ':\n', df.head())

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...