Вы пытаетесь применить решение к другой проблеме.Обратите внимание:
def utf_8_encoder ( unicode_csv_data )
Вы кормите его str
объектами.
Проблемы с чтением не-ASCII CSVФайлы - это то, что вы не знаете кодировку и не знаете разделитель.Если вы знаете кодировку (а это кодировка на основе ASCII (например, cp125x, любая восточноазиатская кодировка, UTF-8, не UTF-16, , а не UTF-32))и разделитель, это будет работать:
for row in csv.reader("foo.csv", delimiter=known_delimiter):
row = [item.decode(encoding) for item in row]
Ваш sample_euro.csv выглядит как cp1252 с разделителем запятых.Русский выглядит как cp1251 с разделителем точек с запятой.Между прочим, из содержимого видно, что вам также необходимо определить, какой формат даты используется и, возможно, также и валюту - в примере на русском языке указаны суммы денег, за которыми следует пробел и аббревиатура от кириллицы для «рублей».
Обратите внимание: сопротивляйтесь всем попыткам убедить вас, что у вас есть файлы, закодированные в ISO-8859-1.Они закодированы в cp1252.
Обновление в ответ на комментарий "" "Если я понимаю, что вы говорите, я должен знать кодировку, чтобы это работало? В общем случаеЯ не буду знать кодировку и на основании другого ответа предположить, что кодировка очень сложная, так что мне не повезло? "" "
Вы должны знать кодировку для ANY упражнение по чтению файлов для работы.
Все время правильно угадывать кодировку для любой кодировки в файле любого размера не очень сложно - это невозможно.Однако ограничение области действия csv-файлами, сохраненными из Excel или Open Office в кодировке по умолчанию для локали пользователя, и разумного размера, это не такая большая задача.Я бы посоветовал попробовать chardet ;он угадывает windows-1252
для вашего евро-файла и windows-1251
для вашего русского файла - фантастическое достижение, учитывая их крошечный размер.
Обновление 2 в ответ на "" " рабочий код будет приветствоваться" ""
Рабочий код (Python 2.x):
from chardet.universaldetector import UniversalDetector
chardet_detector = UniversalDetector()
def charset_detect(f, chunk_size=4096):
global chardet_detector
chardet_detector.reset()
while 1:
chunk = f.read(chunk_size)
if not chunk: break
chardet_detector.feed(chunk)
if chardet_detector.done: break
chardet_detector.close()
return chardet_detector.result
# Exercise for the reader: replace the above with a class
import csv
import sys
from pprint import pprint
pathname = sys.argv[1]
delim = sys.argv[2] # allegedly known
print "delim=%r pathname=%r" % (delim, pathname)
with open(pathname, 'rb') as f:
cd_result = charset_detect(f)
encoding = cd_result['encoding']
confidence = cd_result['confidence']
print "chardet: encoding=%s confidence=%.3f" % (encoding, confidence)
# insert actions contingent on encoding and confidence here
f.seek(0)
csv_reader = csv.reader(f, delimiter=delim)
for bytes_row in csv_reader:
unicode_row = [x.decode(encoding) for x in bytes_row]
pprint(unicode_row)
Выход 1:
delim=',' pathname='sample-euro.csv'
chardet: encoding=windows-1252 confidence=0.500
[u'31-01-11',
u'Overf\xf8rsel utland',
u'UTLBET; ID 9710032001647082',
u'1990.00',
u'']
[u'31-01-11',
u'Overf\xf8ring',
u'OVERF\xd8RING MELLOM EGNE KONTI',
u'5750.00',
u';']
Выход 2:
delim=';' pathname='sample-russian.csv'
chardet: encoding=windows-1251 confidence=0.602
[u'-',
u'04.02.2011 23:20',
u'300,00\xa0\u0440\u0443\u0431.',
u'',
u'\u041c\u0422\u0421',
u'']
[u'-',
u'04.02.2011 23:15',
u'450,00\xa0\u0440\u0443\u0431.',
u'',
u'\u041e\u043f\u043b\u0430\u0442\u0430 Interzet',
u'']
[u'-',
u'13.01.2011 02:05',
u'100,00\xa0\u0440\u0443\u0431.',
u'',
u'\u041c\u0422\u0421 kolombina',
u'']
Обновление 3 Каков источник этих файлов?Если они «сохраняются как CSV» из Excel, OpenOffice Calc или Gnumeric, вы можете избежать всей драмы кодирования, сохранив их как «Excel 97-2003 Workbook (* .xls)» и используя xlrd читать их.Это также избавило бы от необходимости проверять каждый CSV-файл для определения разделителя (запятая против точки с запятой), формата даты (31-01-11 против 04.02.2011) и «десятичной точки» (5750,00 против 450,00) -- все эти различия предположительно создаются путем сохранения как CSV .[Dis] claimer: я автор xlrd
.