Manipulando arquivo txt separado por colunas

1,661 views
Skip to first unread message

Daniel Marinho

unread,
Feb 15, 2014, 8:03:39 PM2/15/14
to python...@googlegroups.com
Boa noite comunidade Pythonica ...

Atualmente realizo um processo em um arquivo txt para remoção de linhas que possuam um determinado valor em uma determinada coluna, as colunas são separada por PIPE " | ", utilizo o excel para descobrir quais linhas devo remover, em seguida removo as linhas usando o notepad++.

Em Python consigo realizar a abertura do arquivo, buscar o valor na linha, porém preciso buscar o valor(data) apenas em uma coluna especifica e em seguida compara-lo com a data atual, caso ele seja maior eu devo remover a linha.

Alguém pode dar uma luz me indicando onde posso ler algum documento que me auxilie?

Forte []'s
Daniel Marinho

Guilherme Loss

unread,
Feb 15, 2014, 8:27:50 PM2/15/14
to python-brasil
Olá, se entendi bem vc quer remover certas linhas que possuem algum valor. Uma maneira bem simples é pular as linhas que vc não quer (que tenha o valor que vc determinar)...essa solução  pode ser otimizada de várias formas...

import sys
x=open(sys.argv[1],'r')
isca = sys.argv[2]
for f in x.readlines():
   if isca in f:
     continue
   else:
     print f,

salva isso com o nome que vc quiser, por exempo 'remove_valor.py'

ai é só executar

python remove_valor.py "arquivo de entrada" "valor" (sem aspas)


[ ]'s


--


Guilherme Loss de Morais, PhD
Bioinformatics Laboratory-LABINFO
National Laboratory of Scientific Computation
www.labinfo.lncc.br
+55 (24) 2233-6094




--
--
------------------------------------
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
 
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Python Brasil" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para python-brasi...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.

Danilo J. S. Bellini

unread,
Feb 15, 2014, 9:47:47 PM2/15/14
to python-brasil
Imagino que queira algo parecido com isto:

def is_valid(column_list, column_index=3, invalid_data="Here!"):
return len(column_list) <= column_index or column_list[column_index] != invalid_data

fname_in = "blablah.txt"
fname_out = "blablah_updated.txt"
split_symbol = "|"

with open(fname_in, "r") as fin:
with open(fname_out, "w") as fout:
for line in fin.readlines():
if is_valid([column.strip() for column in line.split(split_symbol)]):
fout.write(line)

Talvez isso já solucione o problema, mas o objetivo era mais para dar uma ideia, minimamente do que procurar para ler (e.g. métodos strip e split das strings, uso do "open" e do método readlines, bloco with, etc.). Dependendo do que precisar, as strings ainda possuem outros métodos úteis como o "replace":

Para modificar "in place" no próprio arquivo de entrada, recomendo que "desaninhe" os blocos "with", fechando o arquivo em leitura para então abri-lo como escrita, reescrevendo o arquivo inteiro.

Para evitar reescrever o arquivo inteiro (e.g. se o arquivo for gigantesco e a linha a ser removida está somente no final), leia com o modo "r+". Talvez o método "seek" seja útil:
Lembrando que uma escrita nesse modo sobrescreve o conteúdo, e "remover" uma linha significa reescrever tudo o que está abaixo dela em uma nova posição no arquivo.

Para abrir/salvar unicode no Python 2, costumo usar o codecs.open no lugar do open, criando uma função "uopen". Fiz isso, por exemplo, no brutoliquido:
import codecs
uopen = lambda fname, mode: codecs.open(fname, mode, encoding="utf-8")

--
Danilo J. S. Bellini
---------------
"It is not our business to set up prohibitions, but to arrive at conventions." (R. Carnap)

Daniel Marinho

unread,
Feb 17, 2014, 1:37:37 PM2/17/14
to python...@googlegroups.com

Pessoal, agradeço o auxilio, vou dar uma lida no material e produzir algo!

Assim que tiver algo eu posto para vocês visualizarem o código. 

[]'s
Reply all
Reply to author
Forward
0 new messages