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

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

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

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

代码如下:

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

您需要告诉Python使用Unicode字符编码来解码希伯来文字符。
这里有一个链接,指向如何在Python中读取Unicode字符:

所有数据都需要编码才能存储在磁盘上。如果你不知道编码,你能做的就是猜测。这里有一个图书馆:

我强烈推荐Ned Batcheld的演讲 详情请参阅

关于在windows上使用“unicode”作为编码,有一个解释:

TLDR: 微软使用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)

值得注意的是,在使用Python处理文件时,最好使用。你知道输入文件的编码是什么吗?@PauloBu他正在阅读希伯来文字符,但在他的程序中使用ASCII码。这很可能就是问题所在。什么版本的Python?我很高兴。如果你想有一些背景知识向你的领导解释,这些链接将非常有帮助,特别是第一个:,很抱歉,我没有找到解决方案。我尝试使用
编解码器
模块,但输出没有变化。感谢您的输入。但是,当我这样做时,输出文件(由
f.write()
创建)仍然被编码为ANSI,因此当它到达希伯来语字符时,我得到UnicodeEncodeError。顺便说一句,utf_16是正确的表示法。根据您的链接,我将编码从“utf_16”更改为“utf_16_le”,并得到了一个类似的错误,只是与文件的开头有关,而不是与非ascii字符有关。您使用什么程序打开输出文件?我使用记事本。这将如何影响编码?程序必须解码文件以解释其中的内容。你能把这两个文件或类似的原始文本文件放在某个地方吗?我想看看