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

时间:2013-04-24 14:47:59

标签: python encoding

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

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

以下是代码:

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()

2 个答案:

答案 0 :(得分:1)

需要对所有数据进行编码以存储在磁盘上。如果您不知道编码,那么您可以做的最好的就是猜测。有一个库:https://pypi.python.org/pypi/chardet

我强烈推荐Ned Batchelder的演讲 http://nedbatchelder.com/text/unipain.html 详情。

关于在Windows上使用“unicode”作为编码的解释:What's the difference between Unicode and UTF-8?

TLDR: Microsoft使用UTF16作为unicode字符串的编码,但决定将其称为“unicode”,因为它们也在内部使用它。

即使Python2对字符串/ unicode转换有点宽容,你也应该习惯于在输入上解码并在输出上进行编码。

在你的情况下

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)

答案 1 :(得分:0)

您需要告诉Python使用Unicode字符编码来解码希伯来字符。 以下是如何在Python中读取Unicode字符的链接:Character reading from file in Python