Python JSON到CSV-编码错误,UnicodeDecodeError:';charmap';编解码器可以';t解码字节

Python JSON到CSV-编码错误,UnicodeDecodeError:';charmap';编解码器可以';t解码字节,python,json,csv,unicode,cyrillic,Python,Json,Csv,Unicode,Cyrillic,我在将嵌套JSON转换为CSV时遇到问题。为此,我使用了一个完整的json-to-csv.py文件(分叉了一点以支持python 3.4)。 转换正在工作,如果我设置 #Base Condition else: reduced_item[str(key)] = (str(value)).encode('utf8','ignore') 及 但是,当我将csv导入MS Excel时,我会看到错误的西里尔字符,例如\xe0\xf1,英文文本就可以了。 尝试设置encode('cp12

我在将嵌套JSON转换为CSV时遇到问题。为此,我使用了一个完整的json-to-csv.py文件(分叉了一点以支持python 3.4)。 转换正在工作,如果我设置

    #Base Condition
else:
    reduced_item[str(key)] = (str(value)).encode('utf8','ignore')

但是,当我将csv导入MS Excel时,我会看到错误的西里尔字符,例如\xe0\xf1,英文文本就可以了。 尝试设置encode('cp1251','ignore'),但后来我得到了一个错误 UnicodeDecodeError:“charmap”编解码器无法解码位置Y中的字节X:字符映射到(如下所示)

导入系统 导入json 导入csv ## #此函数用于转换以下项: # { #“项目1”:“价值11”, #“项目2”:“价值12”, #“项目3”:“价值13”, #“项目4”:[“分项价值14”、“分项价值15”], #“第5项”:{ #“分项1”:“分项价值11”, #“子项2”:[“子项价值12”、“子项价值13”] # } # } #到 # { #“节点\项目\ 1”:“值\ 11”, #“节点_项_2”:“值_12”, #“节点_项_3”:“值_13”, #“节点项4 0”:“子项值14”, #“节点项”4“1”:“子项值”15, #“节点项目5子项目1”:“子项目值11”, #“节点项目5子项目2子项目0”:“子项目值12”, #“节点\u项目\u 5\u子项目\u 2\u 0”:“子项目\u值\u 13” # } ## def REDUCT_项目(键、值): 全局约化项 #还原条件1 如果类型(值)为列表: i=0 对于价值中的子项: 减少项目(键+符号(i),子项目) i=i+1 #还原条件2 elif类型(值)为dict: sub_keys=value.keys() 对于sub_键中的sub_键: 减少项目(键+子键+子键),值[子键]) #基本条件 其他: 减少的_项[str(key)]=(str(value)).encode('cp1251','ignore') 如果名称=“\uuuuu main\uuuuuuuu”: 如果len(sys.argv)!=4: 打印(“\n用法:python json\u to\u csv.py\n”) 其他: #阅读论点 node=sys.argv[1] json_file_path=sys.argv[2] csv_file_path=sys.argv[3] fp=open(json_文件_路径'r',编码='cp1251') json_value=fp.read() 原始数据=json.loads(json值) 已处理的_数据=[] 标题=[] 对于原始数据[节点]中的项: 减少的_项={} 减少项目(节点,项目) 页眉+=减少的项目.keys() 已处理的\u数据。追加(减少的\u项) 标题=列表(集合(标题)) header.sort() 将open(csv_file_path,'wt+')作为f:#wb+用于python 2.7 writer=csv.DictWriter(f,标题,quoting=csv.QUOTE_ALL,分隔符=',') writer.writeheader() 对于已处理的_数据中的行: writer.writerow(行) 打印(“刚刚完成写入csv文件,包含%d列”%len(标题))
如何正确转换西里尔字母,以及我想跳过坏字符?

您需要知道要打开的文件的西里尔字母编码。 例如,在python3中这已经足够了:

with open(args.input_file, 'r', encoding="cp866") as input_file:
        data = input_file.read()
        structure = json.loads(data)
在python3中,数据变量自动为utf-8。在python2中,向json提供输入可能有问题

还可以尝试在python解释器行中打印出来,看看符号是否正确。没有输入文件很难判断是否一切正常。另外,您是否确定这是python问题,而不是与excel相关的问题?您是否尝试用记事本++或类似的编码打开


使用编码最重要的事情是检查输入和输出是否正确。我建议您看看这里。

也许您可以使用chardet来检测文件的编码

import chardet

File='arq.GeoJson'
enc=chardet.detect(open(File,'rb').read())['encoding']
with open(File,'r', encoding = enc) as f:
    data=json.load(f)
    f.close()

这避免了“踢”编码。

澄清一下,这是我的错:为了从github编码,我在两个方面添加了自己的编码设置,这是错误的。因此,答案是将encoding=“utf8”添加到open(args.input_file,'r',encoding=“cp866”)作为输入_文件:然后在Excel中正确打开该文件。并从(str(value)).encode('cp1251','ignore')和fp=open(json_file_path,'r',encoding='cp1251')中删除编码声明
import chardet

File='arq.GeoJson'
enc=chardet.detect(open(File,'rb').read())['encoding']
with open(File,'r', encoding = enc) as f:
    data=json.load(f)
    f.close()
import chardet

File='arq.GeoJson'
enc=chardet.detect(open(File,'rb').read())['encoding']
with open(File,'r', encoding = enc) as f:
    data=json.load(f)
    f.close()