8位编码文件写入?

时间:2017-08-07 03:22:15

标签: python encoding

我想写一个每个字符只有一个字节的文件,这是必要的,因为银行会这样生成门票......

我的代码是:

arquivo = os.path.join(request.folder,"uploads", "teste.txt")
texto = '01REMESSA01COBRANÇA       3007 ...'.decode("windows-1252")
text_file = open(arquivo, "w")
texto = texto.encode('ISO8859-1','ignore')
text_file.write(texto)
text_file.close()`

它会生成'?'字符。

1 个答案:

答案 0 :(得分:0)

您正在对字符串进行两次编码,这两种情况都是不必要的。固定代码如下:

texto = '01REMESSA01COBRAN\N{LATIN CAPITAL LETTER C WITH CEDILLA}A  ...'
with open(arquivo, 'w', encoding='ISO-8859-1') as text_file:
    text_file.write(texto)

我假设你使用的是Python3,因为你的原始字符串中有一个文字Ç,而Python2中是不允许的。除非给出特殊的前缀(例如b'these are octets'),否则Python3中的所有字符串都是Unicode。通常,您应该尽可能长时间地保持字符串为unicode,在这种情况下,您必须编写一个字节文件。

要尽可能延迟编码,open允许encoding=选项。我喜欢这是指定文件的编码所以如果你正在阅读或写它只是做正确的事情。这允许我们添加

# confirm we read what we meant
print(open(arquivo, encoding='latin-1').read())

哪个有效。注意,'ISO-8859-1''latin-1'在Python中是相同的编码;类似地,\N{CAPITAL...}'Ç'也是相同的,前者在示例目的中更为明显。

我咨询了Python Unicode HOWTO,以确保我记得正确。我建议你阅读它。出于Nick Coghalan" Processing Text Files in Python 3"你应该忘记cp1252。