2 回答

TA贡献1852条经验 获得超1个赞
好的,您正在使用Python 2,因此从文件中读取的是字节字符串。更根据错误信息,您对默认ensure_ascii参数为true。在这种情况下,所有字符串都将使用默认编码(utf8)进行解码。如果您输入的不是utf8编码,则会得到一个UnicodeDecodeError。
该怎么办?
如果您不确定初始编码,只想保留所有内容,则可以声明Latin1编码。它只是更改具有该代码的unicode字符中的每个字节。的ensure_ascii是有点不同的:它只是允许在所得到的JSON字符串,其可导致非便携式的Json任何字节:
RFC没有明确禁止包含不与有效Unicode字符相对应的字节序列的JSON字符串(例如,未配对的UTF-16替代),但是它确实指出它们可能会导致互操作性问题。默认情况下,此模块接受并输出此类序列的代码点(如果存在于原始str中)。
因此,这是一种防弹方式:
def convert2json(filename):
with open(filename) as I:
for line in I:
d = {"data": line}
print(json.dumps(d, encoding='Latin1'))
只是输入文件中的一个非ascii字符,例如'\x..',将在Json中编码为'\u00..'

TA贡献1813条经验 获得超2个赞
好吧,要跳过这些行,您可以使用以下命令:
#!/usr/bin/env python
import json
def convert2json(filename):
with open(filename) as I:
for line in I:
try:
d = {"data": line}
print(json.dumps(d, ensure_ascii=False))
except:
continue
if __name__ == "__main__":
import sys
convert2json(sys.argv[1])
我已经将代码包装在try / except块中的循环中。
这样,当发生错误时,它将被忽略。您将不会从当前行看到任何输出,并且脚本将继续进行到下一行。
但是,尝试使用文件的提供的部分时,我的测试没有引发错误。您能告诉我们文件的编码是什么吗?您确定问题是由这些字符引起的吗?尝试print()在原始代码和计数器中添加一条 语句,以便标识正确的无效行。
添加回答
举报