2017-04-12 44 views
1

我想使用附加的Python代码(Python V3.5.1)读取下面的json数据,但是问题是字符表示形式为?和? £。 请帮我将正确读取和写入数据,并从该文件中的代码,而不改变文件格式或字符集使用Python读取和写入来自Json文件的Unicode字符

JSON数据:

{ 
    "config":[{ 
      "filetype": ".csv", 
      "coldelimiter":"ç", 
      "rowdelimiter":"£" 
    }] 
} 

Python代码:

import json 
import os 

fileLoc=os.path.join(os.getcwd(),"appconfig.json") 
json_data=open(fileLoc).read() 
print(json_data) 

输出:

{ 
    "config":[{ 
      "filetype": ".csv", 
      "coldelimiter":"ç", 
      "rowdelimiter":"£" 
    }] 
} 

回答

0

尽量避免隐式编码和解码。

当您使用open()来读取(或写入)文本文件(如JSON,但与XML不同)时,文件内容将使用某种默认编码进行解码。 使用哪种默认编码取决于您的环境;你可以用locale.getpreferredencoding()看到这个。

因此,让我们假设appconfig.json被存储在磁盘上使用UTF-8,但您的语言环境配置为使用Latin-1的,那么信ç会被误解为序列§。确认:

>>> 'ç'.encode('utf8').decode('latin1') 
'ç' 

如果是这样的话,那么它很容易修复:指定编码上open()

with open(fileLoc, 'r', encoding='utf8') as f: 
    json_data = f.read() 

还有另一种可能(但不太可能)的解释:也许默认的编码已经UTF-8,因此从文件读取数据时会被正确解码。 然后,print()表达式再次使用UTF-8对数据进行编码,从而向STDOUT发送与文件内容完全相同的字节序列。 但是,然后,你的终端(或任何你用来执行脚本)曲解输出为拉丁-1,使它们显示为乱码。

如果是后者的话,那么你需要修复的终端配置(接受UTF-8),或重新编码sys.stdout(与sys.stdout = codecs.getwriter('latin-1')(sys.stdout),但我不建议)。

+0

谢谢@lenz,是的,这正是我做了,现在它的工作。不同的说法,我是Unix环境的新手。我认为在Win env中构建和测试的源代码在Unix env中仍然有效,只要使用相同的Python版本。 对于文件路径或位置我使用os包(如连接(sourceLoc,文件)),希望我的理解没问题。对于Windows路径可以是c:\ filelocation,而在Unix中可以是/ var/sp/filelocation/ 任何有关unix上Python的文档资料都会有所帮助。 – RintG

+0

@RintG我不知道我明白。如果您试图编写可跨操作系统移植的代码,并且使用'os.path.join'来编写路径,那么需要注意一些事情,这当然是一个不错的选择。如果你在Unix上有关于Python的更具体的问题,请发布一个单独的问题。 – lenz