去除CSV文件中的非ASCII字符

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字符以避免此错误。

提前感谢您的帮助。

3个回答

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

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

@DivinusVox,谢谢你的回答,但我想完全删除非ASCII字符。 - Njogu Mbau
谢谢,我有一个关于如何处理它的想法。 - Njogu Mbau

3
如果您想从数据中删除非ASCII字符,则需要遍历数据并仅保留ASCII字符。
for item in data:
     if ord(item) <= 128: # 1 - 128 is ascii
          [append,write,print,whatever]

如果您想将Unicode字符转换为ASCII,则DivinusVox的上面的响应是准确的。

谢谢您的回答,但我想完全删除CSV文件中的非ASCII字符。尝试使用您的函数时,ord()会引发错误..ord()期望长度为1的字符串,但找到了列表。也许是因为每行包含多个字符(列表)。但是,我的主要问题是如何删除CSV文件中的非ASCII字符。 - Njogu Mbau
@Benarito 您的数据是否只是一个字符串一维列表? - DivinusVox
@DivinusVox,是的,一维字符串,例如,第一行,第二行,第三行。 - Njogu Mbau
@Benarito,我建议使用@DivinusVox的修改方案。 ASCII字符的整数ord()值介于1和128之间。如果您不想要ASCII字符,请使用if语句来决定字符串内容是否为ord(x) <= 128。如果您希望数据保持尽可能准确,我建议使用@DivinusVox的修改方案。 - jabgibson
谢谢,我有一个关于如何处理它的想法。 - Njogu Mbau
1
一种单行的Pythonic方式来完成相同的事情:''.join([char for char in data if ord(char) <= 128]) - Steve Saporta

3

谢谢您的回答,但我的主要问题是如何在保存文件内容之前删除非ASCII字符。 - Njogu Mbau
谢谢,我有一个关于如何处理它的想法。 - Njogu Mbau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接