python csv 编码 writerow

0 投票
2 回答
3410 浏览
提问于 2025-04-18 17:39

在Windows 2008服务器上使用web2py时,我遇到了一个问题。

我正在从json创建csv文档,当我把列表写入文件时,出现了以下错误。它在csv的写入行时崩溃。

<type 'exceptions.UnicodeEncodeError'> 'ascii' codec can't encode character u'\\u010c'

在我的电脑上(Windows 7)一切正常,但在服务器上我遇到了编码问题。

有什么建议吗?谢谢。

我创建文件的代码如下:

dataDict = json.loads(data.replace("'", "\""))
path = path
scriptName = os.path.join(path, id + 'script.txt')
file = open(scriptName, 'wb') 
output = csv.writer(file, delimiter='\t')

##Month hours
file.write("begin month_hours \r\n")
file.write("delavec    mesec    month_hours_min    month_hours_max\r\n")
for rec in dataDict["mandatory"]:
    output.writerow(rec)
file.write("\r\nend month_hours \r\n")

2 个回答

1

这个问题发出来已经有一段时间了,所以我猜现在的Python接口可能有变化。现在,你可以用明确的编码方式打开文件,这样可以解决我之前遇到的类似问题:

只需要修改你代码中的这一行就可以了。没有必要让你的代码变得复杂,像O(n2)那样有个内层循环。

open(scriptName, 'w', encoding='utf-8')

或者你可以参考Python文档中的完整示例,链接在这里:docs

import csv
with open('some.csv', newline='', encoding='utf-8') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)
6

JSON字符串总是使用Unicode值,而在Python 2中,当你要把数据写入CSV文件时,需要进行编码。如果你不这样做,Python会默认使用ASCII编码。这样做没问题,如果你的数据都是ASCII范围内的文本,但如果遇到超出这个范围的数据,就会出错。

你需要选择一种不同的编码,并明确进行编码;UTF-8是一种不错的选择:

for rec in dataDict["mandatory"]:
    output.writerow([unicode(c).encode('utf8') for c in rec])

我首先把所有的值转换成unicode(),以防里面有不是unicode()类型的数据,比如数字、布尔值或None。然后结果会被明确编码为UTF-8。

撰写回答