python csv 编码 writerow
在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。