Обновление. Пока код в моем исходном ответе работает, я тем временем выпускаю небольшой пакет по адресу https://pypi.python.org/pypi/csv342, который предоставляет интерфейс, подобный Python 3, для Python 2. Таким образом, независимо от вашей версии Python, вы можете просто выполнить
import csv342 as csv
import io
with io.open('some.csv', 'r', encoding='utf-8', newline='') as csv_file:
for row in csv.reader(csv_file, delimiter='|'):
print(row)
Исходный ответ: вот решение, которое даже с Python 2 фактически декодирует текст в строки Unicode и, следовательно, работает с кодировками, отличными от UTF-8.
В приведенном ниже коде определяется функция csv_rows()
, которая возвращает содержимое файла в виде последовательности списков. Пример использования:
for row in csv_rows('some.csv', encoding='iso-8859-15', delimiter='|'):
print(row)
Вот два варианта для csv_rows()
: один для Python 3+ и другой для Python 2.6+. Во время выполнения он автоматически выбирает подходящий вариант. UTF8Recoder
и UnicodeReader
являются дословными копиями примеров в документации библиотеки Python 2.7 .
import csv
import io
import sys
if sys.version_info[0] >= 3:
# Python 3 variant.
def csv_rows(csv_path, encoding, **keywords):
with io.open(csv_path, 'r', newline='', encoding=encoding) as csv_file:
for row in csv.reader(csv_file, **keywords):
yield row
else:
# Python 2 variant.
import codecs
class UTF8Recoder:
"""
Iterator that reads an encoded stream and reencodes the input to UTF-8
"""
def __init__(self, f, encoding):
self.reader = codecs.getreader(encoding)(f)
def __iter__(self):
return self
def next(self):
return self.reader.next().encode("utf-8")
class UnicodeReader:
"""
A CSV reader which will iterate over lines in the CSV file "f",
which is encoded in the given encoding.
"""
def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
f = UTF8Recoder(f, encoding)
self.reader = csv.reader(f, dialect=dialect, **kwds)
def next(self):
row = self.reader.next()
return [unicode(s, "utf-8") for s in row]
def __iter__(self):
return self
def csv_rows(csv_path, encoding, **kwds):
with io.open(csv_path, 'rb') as csv_file:
for row in UnicodeReader(csv_file, encoding=encoding, **kwds):
yield row
person
roskakori
schedule
05.12.2014
sys.version
и обернуть свой кодif - else
выражением, да. - person Tim Pietzcker   schedule 03.03.2011