2013-08-29 36 views
4

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

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”编解码器不能在1526位置解码字节0x93:顺序不在范围内(128)

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

在此先感谢。

回答

6

如果你真的想要去除它,尝试:

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')) 

如果行是一个集合,不一个unicode字符串,您需要遍历集合到字符串级别以重新序列化它。

+0

@ DivinusVox..Thanks你的答案,但我想彻底删除非ASCII charaters –

+0

@Benarito给编辑一试。 – DivinusVox

+0

谢谢..想法如何去做 –

3

如果你想从你的数据中删除非ASCII字符,然后遍历你的数据,并保持只有ascii。

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

如果你想Unicode字符转换为ASCII,那么通过上面的DivinusVox响应是准确的。

+0

感谢您的回答,但我想完全删除csv文件中的非ASCII字符。在尝试使用你的函数ord()时,会出现一个错误.ord()期望的字符串长度为1,但找到列表。也许是因为每行都包含多个字符(列表)。但是,我的主要问题是如何删除csv文件中的非ASCII字符。 –

+0

@Benarito你的数据只是一个字符串的一维列表? – DivinusVox

+0

@DivinusVox,是,一维字符串,例如,第一行,第二行,第三行 –