【问题标题】:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)UnicodeEncodeError:“ascii”编解码器无法对位置 0-1 中的字符进行编码:序数不在范围内(128)
【发布时间】:2014-09-06 06:17:11
【问题描述】:

我不知道这个错误的确切来源以及如何解决它。我通过运行this code 得到它。

 Traceback (most recent call last):
      File "t1.py", line 86, in <module>
        write_results(results)
      File "t1.py", line 34, in write_results
        dw.writerows(results)
      File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/csv.py", line 154, in writerows
        return self.writer.writerows(rows)
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

任何解释都非常感谢!

我更改了代码,现在出现此错误:

 File "t1.py", line 88, in <module>
    write_results(results)
  File "t1.py", line 35, in write_results
    dw.writerows(results)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/csv.py", line 154, in writerows
    return self.writer.writerows(rows)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

变化如下:

 with codecs.open('results.csv', 'wb', 'utf-8') as f:
        dw = csv.DictWriter(f, fieldnames=fields, delimiter='|')
        dw.writer.writerow(dw.fieldnames)
        dw.writerows(results)

【问题讨论】:

    标签: python unicode


    【解决方案1】:

    这部分代码引发了错误:

    with open('results.csv', 'w') as f:
        dw = csv.DictWriter(f, fieldnames=fields, delimiter='|')
        dw.writer.writerow(dw.fieldnames)
        dw.writerows(results)
    

    您正在打开一个 ASCII 文件,然后尝试向其中写入非 ASCII 数据。我猜想写那个脚本的人在测试期间碰巧从来没有遇到过非 ASCII 字符,所以他从来没有遇到过错误。

    但是,如果您查看 csv module 的文档,您会发现该模块无法正确处理 Unicode 字符串(这是 Beautiful Soup 返回的内容),CSV 文件始终必须以二进制模式打开,并且只有 UTF-8 或 ASCII 可以安全写入。

    因此,您需要在编写所有字符串之前将它们编码为 UTF-8。我首先认为在写入时对字符串进行编码就足够了,但是 Python 2 csv 模块无论如何都会阻塞 Unicode 字符串。所以我想除了显式编码每个字符串之外别无他法:

    parse_results(),换行

    results.append({'url': url, 'create_date': create_date, 'title': title})
    

    results.append({'url': url, 'create_date': create_date, 'title': title.encode("utf-8")})
    

    这可能已经足够了,因为我不希望 URL 或日期包含非 ASCII 字符。

    【讨论】:

    • 我更改了代码,但仍然出现同样的错误。你能看看我更新的帖子吗?你自己能无误地运行这个程序吗?
    • 嗯,这是同一个错误,但它发生在不同的行上。如果您刚刚切换了两个块,则行号应该保持不变 - 您是否更改了其他任何内容?
    • 我是通过谷歌搜索来到这里的,这个更改为我修复了错误。有趣的是,对我来说“ ”导致蟒蛇窒息。这是预期的吗?
    • @user763410:文字文本&amp;nbsp;应该没问题,但是该实体编码的字符超出了ASCII范围,因此实际上可能会导致错误。
    【解决方案2】:

    这应该可行。为我工作。代码sn-p

    import csv
    import sys
    reload(sys)
    sys.setdefaultencoding('utf8')
    data = [["a", "b", u'\xe9']]
    with open("output.csv", "w") as csv_file:
        writer = csv.writer(csv_file, quoting=csv.QUOTE_ALL)
        writer.writerows(data)
    

    【讨论】:

      猜你喜欢
      • 2012-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-22
      • 2012-07-17
      • 1970-01-01
      相关资源
      最近更新 更多