Escrever string em arquivo TXT e codificação ANSI (formato windows) com python 2

1,817 views
Skip to first unread message

Áureo Dias Neto

unread,
Aug 25, 2017, 8:58:44 AM8/25/17
to Python Brasil
tenho uma string como esta:

texto = "cobrança....."

e desejo salvar a mesma em um arquivo TXT com codificação padrão Windows (ANSI) usando python 2 (estou utilizando o Framework web2py)..  
esta codificação é necessária pois se trata de um arquivo remessa para registro de boletos no sicoob

Fabio C. Barrionuevo da Luz

unread,
Aug 25, 2017, 9:32:37 AM8/25/17
to python...@googlegroups.com
A encoding padrão do windows para a lingua portuguesa, inglesa e outras ( http://scratchpad.wikia.com/wiki/Character_Encoding_Recommendation_for_Languages ), até onde eu sei, não é "Windows (ANSI)", e sim "Windows 1252" ( https://en.wikipedia.org/wiki/Windows-1252 ) .

em tese, o código para fazer o que você precisa é basicamente algo como:

# ---
import io

texto = u"cobrança....."
nome_arquivo_saida = "remessa_sicoob.txt"
encoding_do_windows = "windows-1252"


https://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files
modo_abertura_arquivo = "w"

with io.open(nome_arquivo_saida, modo_abertura_arquivo, encoding=encoding_do_windows) as arquivo:
     arquivo.write(texto)
     

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasil+unsubscribe@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Fábio C. Barrionuevo da Luz
Palmas - Tocantins - Brasil - América do Sul


Blog colaborativo sobre Python e tecnologias Relacionadas, mantido totalmente no https://github.com/pythonclub/pythonclub.github.io .

Todos são livres para publicar. É só fazer fork, escrever sua postagem e mandar o pull-request. Leia mais sobre como publicar em README.md e contributing.md.
Regra básica de postagem:
"Você" acha interessante? É útil para "você"? Pode ser utilizado com Python ou é útil para quem usa Python? Está esperando o que? Publica logo, que estou louco para ler...

Linux - Junior Polegato

unread,
Aug 25, 2017, 12:04:30 PM8/25/17
to python...@googlegroups.com
Em 25-08-2017 10:32, Fabio C. Barrionuevo da Luz escreveu:
A encoding padrão do windows para a lingua portuguesa, inglesa e outras ( http://scratchpad.wikia.com/wiki/Character_Encoding_Recommendation_for_Languages ), até onde eu sei, não é "Windows (ANSI)", e sim "Windows 1252" ( https://en.wikipedia.org/wiki/Windows-1252 ) .
[...]

Olá!

        Vou fazer uma breve pausa para _minha_ interpretação, pois nos primórdios era entendido ANSI como a tabela ASCII + 128 carateres, completando assim uma tabela com 256 caracteres, ou 8 bits. Lá no começo essa extensão da tabela ASCII recebeu o nome "code page", ou simplesmente CP, seguida de um número que então especificava o desenho dos outros 128 bytes numa resolução 8x8. Assim no padrão dos EUA era CP437, aqui no Brasil usávamos CP850 ou CP852, com a evolução do Windows e das CPs, hoje no Brasil usa-se a CP1252, muito similar a CP852. Todas são ANSI, pois estão limitadas a 256 caracteres e os 128 primeiros são da tabela ASCII. Hoje em dia vejo grande confusão, pois algumas pessoas interpretam ANSI como CP437, outras como ISO-8859-1, CP850, CP852, CP1252...


-- 

[]'s

Junior Polegato

Nilo Menezes

unread,
Aug 25, 2017, 12:27:09 PM8/25/17
to python...@googlegroups.com, Áureo Dias Neto
Áureo,

Esse é um dos problemas do Python 2... strings não são unicode.
Quanto a Windows ANSI, certifique-se se é Windows-1252 ou ISO-8859-1, pois são diferentes.

Para escrever um arquivo numa codificação específica, utilize o módulo codecs:
https://docs.python.org/2/library/codecs.html

Você provavelmente terá que converter suas strings para unicode, mas isto é relativamente fácil.

Atenciosamente,

Nilo Menezes
--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:


---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.


-- 
-------------------
Nilo Menezes (@lskbr)
Livro: http://python.nilo.pro.br/
Libro: https://www.librodepython.com

Nilo Menezes

unread,
Aug 25, 2017, 12:52:44 PM8/25/17
to python...@googlegroups.com, Linux - Junior Polegato
ASCII é um standard ANSI, especificado com 7 bits.
O melhor mesmo é nem falar de ANSI/OEM.

As páginas de código como CP850, CP437 são abominações do DOS/IBM.
CP850 - Página europeia
CP860 - Página portuguesa
CP437 - Página americana
A CP1252 usado no Windows é uma mescla da 850 com outras páginas para resolver problemas com o Latin-2. Ela é um pouco diferente da ISO8851-1!

A coisa é tão doida que a página Unicode(utf-8) no prompt do Windows é a 65001!
https://msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).aspx

Windows(ansi) não diz muita coisa, mas é a 1252 :-(
Na wikipedia tem um pouco da razão deste erro:
https://en.wikipedia.org/wiki/Windows-1252

Pra entender isso com Python:
http://junglecoders.blogspot.be/2012/07/por-que-utf-8-e-nao-ascii-para-o.html
http://junglecoders.blogspot.be/2012/08/por-que-utf-8-e-nao-ascii-para-o.html
e
https://wiki.python.org.br/TudoSobrePythoneUnicode

Nos primórdios da computação, cada bit precisava ser poupado. Existiram inúmeros formatos de codificação entre 5 e 9 bits. Até o tamanho do bit só foi padronizado muito depois com 8 bits (mas sem standard, apenas por uso e costume).

Cada caracter unicode pode usar até 32 bits! Por isso temos formatos mais compactos como o UTF-8, UTF-16 e abominações da Microsoft como o UCS-2 :-D Esses formatos são chamados de multibyte (ou tamanho variável), pois utilizam mais de um byte por caracter. No caso do utf-8 de 1 a 4 bytes por caracter.

No dia a dia, UTF-8 deveria ser utilizado para tudo, pois é um padrão que independe do computador que você usa.

E se possível pare de usar o Python 2.

Atenciosamente,

Nilo Menezes
--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:


---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.


-- 
-------------------
Nilo Menezes (@lskbr)
Livro: http://python.nilo.pro.br/
Libro: https://www.librodepython.com

Áureo Dias Neto

unread,
Sep 1, 2017, 8:04:57 AM9/1/17
to python...@googlegroups.com, Linux - Junior Polegato
Deu tudo certo meus amigos, obrigado pela ajuda!!
Reply all
Reply to author
Forward
0 new messages