4

我目前正在使用 csv 文件在我的 django 模型中插入数据。下面是一个正在使用的简单保存功能:

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' codec can't decode byte 0x93 in position 1526: ordinal not in range(128)

我的问题是:如何在保存 csv 文件之前删除非 ascii 字符以避免此错误。

提前致谢。

4

3 回答 3

6

如果您真的想剥离它,请尝试:

import unicodedata

unicodedata.normalize('NFKD', title).encode('ascii','ignore')

* 警告这将修改您的数据 * 它试图找到一个接近的匹配 - 即 ć -> c

也许更好的答案是改用u​​nicodecsv

----- 编辑 ----- 好的,如果您根本不关心数据的表示,请尝试以下操作:

# If row references a unicode string
b.create_from_csv_row(row.encode('ascii', 'ignore'))

如果 row 是一个集合,而不是 unicode 字符串,则需要将集合迭代到字符串级别以重新序列化它。

于 2013-08-29T22:57:42.497 回答
3

如果要从数据中删除非 ascii 字符,请遍历数据并仅保留 ascii。

for item in data:
     if ord(item) <= 128: # 1 - 128 is ascii
          [append,write,print,whatever]

如果要将unicode字符转换为ascii,那么DivinusVox上面的响应是准确的。

于 2013-08-29T23:17:54.053 回答
3

Pandas csv 解析器 ( 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=',') 
于 2013-08-30T00:19:48.437 回答