Удаление символов не-ascii в файле csv
В настоящее время я вставляю данные в свои модели django, используя csv файл. Ниже приведена простая функция сохранения, использующая:
def save(self):
myfile = file.csv
data = csv.reader(myfile, delimiter=',', quotechar='"')
i=0
for row in data:
if i == 0:
i = i + 1
continue #skipping the header row
b=MyModel()
b.create_from_csv_row(row) # calls a method to save in models
Функция отлично работает с символами ascii. Однако, если в файле csv есть некоторые символы, отличные от ascii, тогда возникает ошибка: UnicodeDecodeError
кодек 'ascii' не может декодировать байт 0x93 в позиции 1526: порядковый номер не в диапазоне (128)
Мой вопрос: Как удалить символы, отличные от ascii, перед сохранением моего файла csv, чтобы избежать этой ошибки.
Спасибо заранее.
Ответы
Ответ 1
Если вы действительно хотите его разбить, попробуйте:
import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii','ignore')
* ПРЕДУПРЕЖДЕНИЕ ЭТО ИЗМЕНИТЬ ВАШИ ДАННЫЕ *
Он пытается найти близкое совпадение - т.е. Ć → c
Возможно, лучшим ответом будет использование unicodecsv.
----- РЕДАКТИРОВАТЬ -----
Хорошо, если вам все равно, что данные вообще представлены, попробуйте следующее:
# If row references a unicode string
b.create_from_csv_row(row.encode('ascii', 'ignore'))
Если строка представляет собой коллекцию, а не строку юникода, вам нужно будет перебирать коллекцию на уровне строки, чтобы повторно сериализовать ее.
Ответ 2
Если вы хотите удалить символы, отличные от ascii, из ваших данных, выполните итерацию по вашим данным и сохраните только ascii.
for item in data:
if ord(item) <= 128: # 1 - 128 is ascii
[append,write,print,whatever]
Если вы хотите преобразовать символы Unicode в ascii, то ответ выше DivinusVox является точным.
Ответ 3
Pandas csv parser (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html) поддерживает различные кодировки:
import pandas
data = pandas.read_csv(myfile, encoding='utf-8', quotechar='"', delimiter=',')