Python:UnicodeEncodeError:'ascii'编解码器无法在位置78处编码字符u'\xf1':序数不在范围内(128)。

5

我尝试了两种方法来解决这个问题,但是都会导致另一个错误。首先尝试使用encode,另一种方法是尝试使用strip(#),假设这就是导致错误的问题:

"color":rcolor,"text_color":tcolor})
File "/usr/lib/python2.7/csv.py", line 152, in writerow
    return self.writer.writerow(self._dict_to_list(rowdict))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf1' in position 78: ordinal not in range(128)

我的代码现在看起来像这样:

routes = db.routes.find()
    for route in routes:
        try:
            color = route["properties"]["color"]
            color = color.strip('#')
            print(color)

            tcolor = route["properties"]["tcolor"]
            tcolor = tcolor.strip('#')
            print(tcolor)
        except KeyError:
            color = "0000FF"
            tcolor = ""

        writer.writerow({"route_id":route["route_id"],
                   "agency_id":route["properties"]["agency_id"],...,
                   "route_color":color,"route_text_color":tcolor})

我不太确定为什么它一直出现Unicode错误...


请发布一个可工作的问题示例。这很可能是您打开文件进行写入的方式有问题。 - tdelaney
你为什么要使用2.7版本呢?Python 3的Unicode支持更好。只有在存在一些旧的依赖关系时,2.x才有用。 - tdelaney
1个回答

3
尝试在写入csv之前将您的字典解析为Unicode值。
def convert(input):
    if isinstance(input, dict):
        return {convert(key): convert(value) for key, value in input.iteritems()}
    elif isinstance(input, list):
        return [convert(element) for element in input]
    elif isinstance(input, unicode):
        return input.encode('utf-8')
    else:
        return input

if __name__ == "__main__":
    utf_route = convert(route)

如果你在写入csv文件时遇到错误,请尝试使用以下方法。

import codecs

with codecs.open("local/file1.csv", "w", encoding='utf8') as f:
    writer = csv.writer(f, delimiter=",")
    writer.writerow(data.keys())
    writer.writerow(data.values())

我试图将它放在这个部分周围,但错误仍然存在...: for route in routes: if name == "main": utf_route = convert(route) try: route_color = route["properties"]["route_color"] route_color = route_color.strip('#') print(route_color) - Reiion
@Reiion 没问题。不要像你第一条评论那样在路由上使用for循环。你只需要将“routes”字典传递给“convert”方法,返回的将是一个以“utf-8”编码的字典。如果你看到有一个递归调用return {convert(key): convert(value) for key, value in input.iteritems()},它会处理这个问题。 - Varad
谢谢您的理解。嗯,我按照您说的做了。将convert放在了mongodb查询routes = db.routes.find之后,并像这样传递:如果__name__ == "main": utf_route = convert(routes)。但是仍然出现相同的错误。 - Reiion
@Reiion,你可以尝试在程序顶部添加 # -*- coding: utf-8 -*- 吗?另外,你需要那些非 ASCII 值吗?或者直接使用 strip 函数去掉它们是否可行? - Varad
叹气哈哈地加了一些代码,然后运行,但仍然出现相同的错误。如果需要的话,可以在读取时轻松添加回来。我只是真的必须解决这个问题。奇怪的是,我尝试打印字典值直到出错的位置,它会毫无问题地打印出来。错误只会在 CSV 写入时发生。 - Reiion
显示剩余3条评论

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