[python-brasil] Ler colunas de CSV py

1,059 views
Skip to first unread message

Elias de Oliveira

unread,
Oct 3, 2012, 1:27:17 PM10/3/12
to python...@yahoogrupos.com.br
 

Galera,

Estava precisando ler um csv com a seguinte configuração:

index | bla
1 | 4

Queria ler coluna a coluna ao invés de linha a linha, pois esses csvs
tem uma série de regras complexas que ficariam bem confusas se eu
começar a ler de linha em linha. Já usei o csv.reader antes, mas só
consegui com ele ler linha a linha. Teria alguma forma fácil/pythonica
de se ler coluna a coluna?

[]'s

--
Elias Granja
Web and Android developer
http://www.eliasgranja.com
Phone: +55 19 8124-2645

__._,_.___
Atividade nos últimos dias:
.

__,_._,___

João Paulo Saboia

unread,
Oct 4, 2012, 8:36:05 AM10/4/12
to python-br...@yahoogrupos.com.br, python...@yahoogrupos.com.br
Eu tenho duas funções pra resolver esse problema.
Aqui tive problemas usando o tranpose em alguns casos (string), então criei
outra função para transpor linhas e colunas.
A primeira função é para leitura de um arquivo qualquer com um separador
específico, tendo cabeçalho ou não:

def le_arq_sep(arquivo,sep='',ncab=0):
'''Lê arquivo com separador específico
Entrada: nome do arquivo, string (separador), ncab (número de
linhas do cabeçalho)
Saída: lista de listas, contendo os valores da tabela'''

arq = open(arquivo,'r') ; linhas = arq.readlines() ; linhas =
linhas[ncab:] ; arq.close()

lista = []

for linha in linhas:

a = linha.split(sep)
lista.append(a)

return lista;




Essa segunda é para transpor a lista que você obteve após a leitura:



def transpoe_lista(lista):
'''Transpõe uma matriz de listas
Entrada: lista de listas
Saída: lista de listas, após sofrer transposição'''

tam = len(lista[0])
saida = []

i = 0
while i<tam:
saida.append([])
i = i + 1

for lis in lista:
for i,val in enumerate(lis): saida[i].append(val)

return saida;



Te ajuda?



Em 3 de outubro de 2012 14:27, Elias de Oliveira
<con...@eliasgranja.com>escreveu:

> **
>
>
> Galera,
>
> Estava precisando ler um csv com a seguinte configuração:
>
> index | bla
> 1 | 4
>
> Queria ler coluna a coluna ao invés de linha a linha, pois esses csvs
> tem uma série de regras complexas que ficariam bem confusas se eu
> começar a ler de linha em linha. Já usei o csv.reader antes, mas só
> consegui com ele ler linha a linha. Teria alguma forma fácil/pythonica
> de se ler coluna a coluna?
>
> []'s
>
> --
> Elias Granja
> Web and Android developer
> http://www.eliasgranja.com
> Phone: +55 19 8124-2645
>
>


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



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

Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
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


Linux - Junior Polegato

unread,
Oct 4, 2012, 10:32:10 AM10/4/12
to João Paulo Saboia, Python Brasil
Em 04-10-2012 09:36, Jo�o Paulo Saboia escreveu:
> Eu tenho duas fun��es pra resolver esse problema.
> Aqui tive problemas usando o tranpose em alguns casos (string), ent�o criei
> outra fun��o para transpor linhas e colunas.
> A primeira fun��o � para leitura de um arquivo qualquer com um separador
> espec�fico, tendo cabe�alho ou n�o:
> [...]

Ol�!

Fa�o assim:

separador = '\t' # Separador de colunas, troque se necess�rio
arquivo = '/caminho/do/arquivo.csv'

matriz_csv = [linha.split(separador) for linha in
open(arquivo).read().replace('\r', '').strip().split('\n')]
matriz_csv_transposta = zip(*matriz_csv)


[]'s
Junior Polegato

Anderson Cardoso

unread,
Oct 4, 2012, 12:08:48 PM10/4/12
to python...@googlegroups.com, João Paulo Saboia
somente dois adendos:

o modulo csv tem problemas em suportar unicode, existe um projeto que se chama unicodecsv que modifica o reader e writer para dar suporte decente a unicode e usa a mesma 'interface' que o csv, ou seja, é só mudar o import. Só procurar no github.

se o seu csv for gigante (por exemplo, um dump de um banco de dados) essa solução de carregar numa matriz é bem ineficiente, você terá problemas com memória.

mas se memória não for um problema:

from unicodecsv import reader

with open('file.csv') as file_:
    csv_data = unicodecsv.reader(file_, delimiter='|')
    coluna1, coluna2, coluna3 = zip(*csv_data)

abs

Anderson


Em 4 de outubro de 2012 11:32, Linux - Junior Polegato <li...@juniorpolegato.com.br> escreveu:
Em 04-10-2012 09:36, João Paulo Saboia escreveu:
Eu tenho duas funções pra resolver esse problema.
Aqui tive problemas usando o tranpose em alguns casos (string), então criei
outra função para transpor linhas e colunas.
A primeira função é para leitura de um arquivo qualquer com um separador

específico, tendo cabeçalho ou não:
[...]

Olá!

        Faço assim:

separador = '\t'  # Separador de colunas, troque se necessário

arquivo = '/caminho/do/arquivo.csv'

matriz_csv = [linha.split(separador) for linha in open(arquivo).read().replace('\r', '').strip().split('\n')]
matriz_csv_transposta = zip(*matriz_csv)


[]'s
        Junior Polegato

--
------------------------------------
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:



--
Anderson Pierre Cardoso
Software Engineer - IT3S / University of Sao Paulo

http://www.apierrecardoso.com

twitter: @apierre_cardoso


Elias de Oliveira

unread,
Oct 4, 2012, 9:18:13 PM10/4/12
to python...@googlegroups.com, João Paulo Saboia
Galera,

Muito obrigado pelas respostas vou testar amanhã. :)

Anderson, acho que então que não poderei usar a sua solução, o meu csv
é justamente um dump de banco de dados de produção com vários dados, a
ponto do open office "gemer" para abrir. Também dei uma lida melhor no
DictReader e talvez ele com o iteritems possa resolver meu problema.
Pois ai consigo ter uma "Noção" melhor em que ponto do csv estou :).

[]'s

Em 4 de outubro de 2012 13:08, Anderson Cardoso
<apierre...@gmail.com> escreveu:
>> python-brasi...@googlegroups.com
>
>
>
>
> --
> Anderson Pierre Cardoso
> Software Engineer - IT3S / University of Sao Paulo
>
> http://www.apierrecardoso.com
> twitter: @apierre_cardoso
>
>
>
> --
> ------------------------------------
> 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-brasi...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages