2017-08-07 51 views
2

我想写一个文件,每个字符一个字节而已,因为银行使这个产生门票,有必要...8位编码文件写入?

我的代码是:

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

它产生“?”字符。

+0

你怎么知道这些是'?'字符?你确定你正在用ISO8859-1编码查看你的输出文件吗? –

+0

这是输出使用编码'mbcs''01REMESSA01COBRANÃ?A ......' –

回答

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被允许。 Python3中的所有字符串都是Unicode,除非有特殊的前缀(例如b'these are octets')。一般来说,你应该尽可能长的保留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。

+0

我忘了,我使用python 2 ..因为我的系统正在运行老版本的CentOS和py2 ..正确的我想保存ANSI编解码器中的.txt文件,使用Windows断行,因为我的银行只允许这个..谢谢所有 –

+0

我需要在ANSI标准的窗口中编码生成文件,因为面部字符必须只占用一个字节..就像当一个带有记事本的文件..如果我用引用的字符串生成相同的文件,通过记事本,它适用于银行的api。 –