2017-08-07 91 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。 –