【问题标题】:Removing non-ascii characters in a csv file删除 csv 文件中的非 ascii 字符
【发布时间】:2013-09-02 13:07:36
【问题描述】:

我目前正在使用 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”编解码器无法解码位置 1526 中的字节 0x93:序数不在范围内(128)

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

提前致谢。

【问题讨论】:

    标签: python django csv converter


    【解决方案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'))
    

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

    【讨论】:

    • @DivinusVox..感谢您的回答,但我想完全删除非 ascii 字符
    • 谢谢..知道如何去做
    【解决方案2】:

    如果您想从数据中删除非 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 字符。
    • @Benarito 你的数据只是一维字符串列表吗?
    • @DivinusVox,是的,一维字符串,例如,第一行,第二行,第三行
    • @Benarito 我建议@DivinusVox 的编辑解决方案。 Ascii 字符有一个介于 1 和 128 之间的整数 ord() 值。如果您不想要 ascii 字符,请使用 if 语句来确定字符串内容是否为 ord(x) &lt;= 128。如果您希望您的数据尽可能准确,我建议您使用 @DivinusVox 的编辑解决方案。
    • 单行 Pythonic 方式来做同样的事情:''.join([char for char in data if ord(char)
    【解决方案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=',') 
    

    【讨论】:

    • 感谢您的回答,但我的主要问题是如何在保存文件内容之前删除非 ascii 字符..
    • 谢谢..知道如何去做
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 2011-03-16
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多