使用Python写入文本文件时的编码问题

Encoding issue when writing to text file, with Python

我正在编写一个程序,用一个简短的python脚本"手动"安排一个csv文件,使其成为正确的json语法。从输入文件中,我使用readlines()将文件格式化为一个行列表,然后将其操作并集中到一个字符串中,然后将该字符串输出到一个单独的.txt文件中。但是,输出包含输入文件中出现的乱码而不是希伯来文字符,并且输出是两倍行距的水平(在每个字符之间添加一个空格字符)。据我所知,问题与编码有关,但我还没弄清楚是什么。当我检测到输入和输出文件的编码(使用.encoding属性)时,它们都返回None,这意味着它们使用系统默认值。技术细节:python 2.7、windows 7。

虽然有很多关于这个话题的问题,但我没有找到我的问题的直接答案。在这种情况下,检测系统默认值对我没有帮助,因为我需要可移植的程序。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def txt_to_JSON(csv_list):
    ...some manipulation of the list...
    return JSON_string
file_name ="input_file.txt"
my_file = open(file_name)
# make each line of input file a value in a list
lines = my_file.readlines()
# break up each line into a list such that each 'column' is a value in that list
for i in range(0,len(lines)):
    lines[i] = lines[i].split("\t")
J_string = txt_to_JSON(lines)
json_file = open("output_file.txt","w+")
json_file.write(jstring)
json_file.close()


所有数据都需要编码才能存储在磁盘上。如果你不知道编码,你能做的最好的就是猜测。这里有一个库:https://pypi.python.org/pypi/chardet

我强烈推荐内德·巴切尔德的演讲http://nedbatchelder.com/text/unipain.html详情。

有一个关于在Windows上使用"unicode"作为编码的解释:unicode和utf-8有什么区别?

TLDR:微软使用UTF16作为Unicode字符串的编码,但决定称之为"Unicode",因为他们也在内部使用它。

即使python2在字符串/unicode转换方面有点宽松,您也应该习惯于在输入时解码,在输出时编码。

以你为例

1
2
3
4
5
6
7
8
9
10
11
12
filename = 'where your data lives'
with open(filename, 'rb') as f:
   encoded_data = f.read()
decoded_data = encoded_data.decode("UTF16")

# do stuff, resulting in result (all on unicode strings)
result = text_to_json(decoded_data)

encoded_result = result.encode("UTF-16")  #really, just using UTF8 for everything makes things a lot easier
outfile = 'where your data goes'
with open(outfile, 'wb') as f:
    f.write(encoded_result)


您需要告诉python使用Unicode字符编码来解码希伯来语字符。下面是一个如何在python中读取unicode字符的链接:在python中从文件中读取字符