[python-brasil] ignorar quebra de linha

958 views
Skip to first unread message

Zhu Sha Zang

unread,
Nov 22, 2010, 7:57:09 AM11/22/10
to python...@yahoogrupos.com.br
Bom dia, lendo um arquivo texto onde cada linha possui três campos, como
se formassem colunas, pretendo colocar cada campo em uma lista
separada.Assim:

a1 b1 c1
a2 b2 c2
a3 b3 c3
a4 b4 c4
...

utilizando:

ln = l.split(' ')

Consigo posteriormente colocar cada ln[0], ln[1] e ln[2] em um loop para
criar as 3 listas.

Entretanto, o último campo está capturando a quebra de linha.

Como fazer para que isso não ocorra e o campo ln[2] não capture a quebra
de linha?

Obrigado


[As partes desta mensagem que não continham texto foram removidas]

------------------------------------

,-----------------------------------------------------------.
| Antes de enviar um e-mail para o grupo leia: |
| http://www.pythonbrasil.com.br/moin.cgi/AntesDePerguntar |
| E se você é usuário do BOL lembre-se de cadastrar o |
| e-mail do grupo na lista branca do seu sistema anti-spam. |
`-----------------------------------------------------------´Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
http://br.groups.yahoo.com/group/python-brasil/

<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@yahoogrupos.com.br

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
http://br.yahoo.com/info/utos.html


Fábio Cerqueira

unread,
Nov 22, 2010, 8:04:51 AM11/22/10
to python...@yahoogrupos.com.br
use o strip na linha

2010/11/22 Zhu Sha Zang <zhush...@yahoo.com.br>

>
>
> Bom dia, lendo um arquivo texto onde cada linha possui três campos, como
> se formassem colunas, pretendo colocar cada campo em uma lista
> separada.Assim:
>
> a1 b1 c1
> a2 b2 c2
> a3 b3 c3
> a4 b4 c4
> ...
>
> utilizando:
>
> ln = l.split(' ')
>
> Consigo posteriormente colocar cada ln[0], ln[1] e ln[2] em um loop para
> criar as 3 listas.
>
> Entretanto, o último campo está capturando a quebra de linha.
>
> Como fazer para que isso não ocorra e o campo ln[2] não capture a quebra
> de linha?
>
> Obrigado
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>
>

--
Fábio Cerqueira

Fábio Cerqueira

unread,
Nov 22, 2010, 8:06:59 AM11/22/10
to python...@yahoogrupos.com.br
Enviei antes.
Ex: l.strip().split()

2010/11/22 Fábio Cerqueira <fa...@acens.com.br>

Joao S. O. Bueno

unread,
Nov 22, 2010, 8:25:22 AM11/22/10
to python...@yahoogrupos.com.br
Bom..pra eliminar oa quebra de linha ai, tanto o strip (remove o
caracter) quanto o replace (subsitui o caracter por anda) serviriam.

No entanto, perceba que as linhas nesse caso já te servem para alguma
coisa: elas jpá sáo uam divisão logica dos sesus dados -- Você estaria
juntando tudo (sem a separação de linha) para depois juntar de novo.
Precisa de informação a mais para isso (a quantidade de tokens de
cada linha). Não que seja importante, e é igualemente factível - mas
eu considero que é complicar a coisa: deixar seus dados "amorfos" sem
necessidade.

Então, o melhor aí é justamente fazer um "split" nas quebras de linha
- no "\n", pra começar.

Ai, se tata de "desfazer" um "zip" ou seja, desintercalar dados.
Um jeito bastante legível de se faze-lo é:


>>> a = """a1 b1 c1
... a2 b2 c2
... a3 b3 c3
... a4 b4 c4"""
>>> final = []
>>> for linha in a.split("\n"):
... for i, token in enumerate(linha.split()):
... if len(final) <= i: final.append([])
... final[i].append(token)
...
>>> final
[['a1', 'a2', 'a3', 'a4'], ['b1', 'b2', 'b3', 'b4'], ['c1', 'c2', 'c3', 'c4']]

Note que coincidentemente "unzip" é o tema do último post no meu blog
de python avançado -
http://metapython.blogspot.com/2010/11/x-unzip-and-peeping-into-it.html
-

E como o RBP bem notou nos comentários, o "zip" pode ser usado como
Unzip: basta passar as tuplas com os dados intercalados, cada uma como
um parâmetro, para ele mesmo:

>>> a = """a1 b1 c1
... a2 b2 c2
... a3 b3 c3
... a4 b4 c4"""
>>> final = zip(*(c.split() for c in a.split("\n")) )
>>> final
[('a1', 'a2', 'a3', 'a4'), ('b1', 'b2', 'b3', 'b4'), ('c1', 'c2', 'c3', 'c4')]


Se sua cadeia de dados for longa do tipo que você pode ganhar alguma
coisa se puder ir consumindo os dados aos poucos, sem ter tudo na
memória, o post acima tem uma função que permite separar cada cadeia
de dados da stream em um generator ... mas acho qeu você não vai
precisar de tanto. :-)

js
-><-

Fábio Cerqueira

unread,
Nov 22, 2010, 9:19:47 AM11/22/10
to python...@yahoogrupos.com.br
lembrando que se for separado por espaços e você quer remover a quebra de
linha:
>>> l = 'a b c\n'
>>> l.strip().split(' ')
['a', 'b', 'c']
>>> l.split()
['a', 'b', 'c']

O split quando não é passado o separador remove qualquer whitespace

2010/11/22 Joao S. O. Bueno <jsb...@python.org.br>

--
Fábio Cerqueira


[As partes desta mensagem que não continham texto foram removidas]

------------------------------------

Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar


Para sair deste grupo, envie um e-mail para:

python-brasi...@yahoogrupos.com.brLinks do Yahoo! Grupos

Junior Polegato - Linux

unread,
Nov 22, 2010, 11:38:14 AM11/22/10
to python...@yahoogrupos.com.br
Em 22-11-2010 10:57, Zhu Sha Zang escreveu:
> Bom dia, lendo um arquivo texto onde cada linha possui três campos, como
> se formassem colunas, pretendo colocar cada campo em uma lista
> separada.Assim:
> a1 b1 c1
> a2 b2 c2
> a3 b3 c3
> a4 b4 c4
> ...
> utilizando:
> ln = l.split(' ')
> Consigo posteriormente colocar cada ln[0], ln[1] e ln[2] em um loop para
> criar as 3 listas.
> Entretanto, o último campo está capturando a quebra de linha.
> Como fazer para que isso não ocorra e o campo ln[2] não capture a quebra
> de linha?
>

Olá,

Se cada campo é separado por exatamente um espaço e cada linha
terminada por '\n', eu faria uma matriz desse arquivo assim:

matriz = [linha.split(' ') for linha in
open('arquivo.dat').read().strip().split('\n')]

Na sua questão em específico, pode usar

ln = l.strip().split(' ')

Ou ainda, se tiver certeza do '\n', pode-se trocar o ".strip()"
por "[:-1]" em ambos os casos, fazendo com que se ignore o '\n' no final.


[]'s
Junior Polegato

------------------------------------

Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar


Para sair deste grupo, envie um e-mail para:

python-brasi...@yahoogrupos.com.brLinks do Yahoo! Grupos

Reply all
Reply to author
Forward
0 new messages