Como detectar uma linha em branco em um arquivo texto no linux que foi produzido no windows?

1,673 views
Skip to first unread message

Fabiano Vasconcelos

unread,
Sep 12, 2016, 3:44:15 PM9/12/16
to Python Brasil
Olá, pessoal!
Boa tarde!

Observando a dica "Antes de Perguntar", aqui estou eu pedindo a ajuda de vocês.
Gente, estou implementando um código em Python no meu linux, que lê um arquivo texto que é oriundo do windows, ou seja, tem uma ligeira diferença de caracteres de final de linha.
Eis um fragmento do código que eu estou tentando implementar:

def blankline():
global lines
for i in range(lines):
if fileReadSplitted.startswith('\r'):
print("Linha em branco")

Porém, ele me retorna o seguinte erro na hora de rodar:

/usr/bin/python3.5 /home/newwave/projects/PafKit/Pafkit.py
Traceback (most recent call last):
Pafkit analisa o arquivo do anexo IV do seu PAF-ECF
  File "/home/newwave/projects/PafKit/Pafkit.py", line 79, in <module>
Versão 0.1
    blankline()
<<< Renomeie o arquivo a ser analisado para "anexoIV.txt" >>>
  File "/home/newwave/projects/PafKit/Pafkit.py", line 67, in blankline
Jent Software - www.jent.com.br
    if fileReadSplitted.startswith('\r'):
AttributeError: 'list' object has no attribute 'startswith'

O que acontece é que eu estou tentando detectar uma possível linha em branco em um arquivo texto, para que, ao escanear, aponte a tal linha. Já tentei fazer de algumas formas diferentes, sugeridas em páginas apontadas pelo google, mas não tive sucesso. Alguém poderia me dar uma luz do que esteja acontecendo?

Boa semana a todos!

Luís Tavares

unread,
Sep 12, 2016, 4:07:08 PM9/12/16
to python...@googlegroups.com
Você está iterando sobre o range(lines) quando deveria iterar sobre o lines provavelmente, não está muito claro no código. Ainda, no momento que você itera sobre o lines, o seu i vira o objeto str a ser checado se começa com o "\r". 

Abcs, 

Luís Alberto Tavares Poli


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

Fabiano Vasconcelos

unread,
Sep 13, 2016, 9:54:51 AM9/13/16
to Python Brasil
Amigo, peço um pouco de paciência comigo, uma vez que Python é uma linguagem nova pra mim. Obrigado pela atenção.
Bem, se eu te entendi corretamente, eu deveria remover 

for i in range(lines):

e deixar apenas

for i in lines:

Seria isso? Mas se for assim, dá um erro:

Traceback (most recent call last):
  File "/home/newwave/projects/PafKit/Pafkit.py", line 79, in <module>
    blankline()
  File "/home/newwave/projects/PafKit/Pafkit.py", line 66, in blankline
    for i in lines:
TypeError: 'int' object is not iterable

Ou seja, um int não é interável? Não entendi! Em C/C++ se você quer uma iteração você usa um int e somente um int:

for(int i = 0; i = 10; i++);

Tentei também usar a seguinte forma:

def blankline():
global lines
for i in range(lines):
        if fileReadSplitted[i].startswith('\r'):

print("Linha em branco")

Com um índice [i] em fileReadSplitted, mas apesar de não produzir erro algum ele não imprime a mensagem "Linha em branco".

Alguma dica?

Luís Alberto Tavares Poli




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

Luís Tavares

unread,
Sep 13, 2016, 10:15:46 AM9/13/16
to python...@googlegroups.com
Bom dia, Fabiano. 
Sobre o erro que apresenta, é meramente por que o objeto (int) não tem o padrão de iterador implementado. 

Mais sobre isso aqui: https://pt.wikipedia.org/wiki/Iterador e aqui https://speakerdeck.com/ramalho/de-iteradores-a-geradores-evolucao-de-um-pattern-em-python (A do Luciano Ramalho inclusive tem exemplos fantásticos, como sempre)  

Você acha que consegue mostrar pra gente a referência desse fileReadSplitted? 
Se for, por exemplo, o arquivo "lido" separado por "\n" pode ser por isso que o código não esteja te mostrando o que você espera.

Abcs,

Luís Alberto Tavares Poli




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

Fabiano Vasconcelos

unread,
Sep 13, 2016, 10:27:28 AM9/13/16
to Python Brasil
Obrigado pela ajuda e pela paciência, Luís!
Desculpe a minha ignorância.
Vou dar uma lida agora mesmo. Qualquer coisa, volto a postar.

Clemente Junior

unread,
Sep 13, 2016, 10:29:18 AM9/13/16
to python...@googlegroups.com

Olá, vamos ver se entendi bem teu código:

def blankline():
    global lines # Essa variável armazena o número de linhas da  lista fileReadSplitted
    for i in range(lines): # Itera sobre o range(0, lines)
        if fileReadSplitted[i].startswith('\r'): # Se a linha começar com '\r' irá imprimir "Linha em branco"


            print("Linha em branco")


É isso?

Na primeira forma que você mandou, no if quando usa "if fileReadSplitted.startswith('\r'):" você está usando o método startswith numa lista, por isso gerou aquele erro, já que esse método é do objeto str. Já na segunda, vc usa a forma correta "if fileReadSplitted[i].startswith('\r'):" porém não imprime a mensagem. Se não imprime é porque nenhuma linha não inicia com o '\n', pode ser por exemplo que a linha comece com um ' ' ou algo assim, ou então a quebra de linha está no formato unix (apenas \n). Você poderia fazer o if da seguinte format:

if fileReadSplitted[i].replace('\r\n', '\n').strip(' ').startswith('\n'):


pois dessa forma o python removeria os espaços em branco do linha e também converteria as quebras em um único formato para ficar mais fácil a verificação.


Espero ter ajudado,


Clemente Jr.

Marcelo Valle (BLOOMBERG/ LONDON)

unread,
Sep 13, 2016, 10:35:51 AM9/13/16
to python...@googlegroups.com
Fabiano, 

> Ou seja, um int não é interável? Não entendi! Em C/C++ se você quer uma iteração você usa um int e somente um int:

Um "objeto interavel" eh uma colecao, pode ser um array, um map, alguma coisa que possua multiplos valores. 
O for / in no python itera em colecoes. Quando voce usa `range(n)`, estah na verdade retornando uma colecao com todos os valores entre 0 e n. Entao em `for i in range(n)`, `i` assume cada um dos valores retornados por `range(n)`

Se voceh ainda tem duvida, abra um terminal python e digite `range(5)` para ver o que eh retornado.

Abracos,
Marcelo.


<< ideas don't deserve respect >>

Flávio Casacurta

unread,
Sep 13, 2016, 10:36:13 AM9/13/16
to Python Brasil
In [3]: line ='\n'

In [4]: len(line)
Out[4]: 1

In [5]: isBlank = lambda line: not line.strip()

In [6]: isBlank(line)
Out[6]: True

Tenta:
lines = open(meuarquivo.txt).readlines()
ou
lines = open(meuarquivo.txt)..read().splitlines()

Marcelo Valle (BLOOMBERG/ LONDON)

unread,
Sep 13, 2016, 10:40:31 AM9/13/16
to python...@googlegroups.com
Outro detalhe, mostrado no e-mail abaixo, checar se a linha comeca com '\r' nao eh uma forma legal de detectar se a linha eh "branca". Por que? Porque uma linha poderia comecar com '\n' em outros sistemas operacionais e se for a ultima linha do arquivo, poderia nao ter qualquer caracter.

O melhor eh usar `strip()` para remover os espacos em branco e verificar se `line.strip() == ''`. Outra forma, abusando da syntaxe que o python oferece, eh usar o fato que python pode usar uma string como condicao booleana e usar `not line.strip()`, como mostrado abaixo. 

[]s

Subject: Re: [python-brasil] Como detectar uma linha em branco em um arquivo texto no linux que foi produzido no windows?
In [3]: line ='\n'
--
--
------------------------------------
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ê 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.

Anderson Unsonst

unread,
Sep 13, 2016, 10:42:28 AM9/13/16
to python...@googlegroups.com

Depois tenta estudar uma solução usando expressão regular

Fabiano Vasconcelos

unread,
Sep 14, 2016, 2:17:14 PM9/14/16
to Python Brasil
Senhores, muitíssimo obrigado pela enxurrada de mensagens que vocês postaram! Fico muito feliz em saber que eu estou inserido em uma comunidade com espírito de autruísmo e com tanta gente fera em Python!
Ainda não tive tempo de ler cada mensagem, mas vou fazê-lo agora e tentar tirar um denominador comum e se preciso for, respondê-las.

Té daqui a pouco!

Fabiano Vasconcelos

unread,
Sep 14, 2016, 5:55:09 PM9/14/16
to Python Brasil
Olá, Clemente!
Boa tarde!

Sim, você conseguiu descrever com precisão o que o meu código intende. Uma informação útil a respeito é a seguinte linha

fileReadSplitted = (fileRead.split('\n'))  # This separate all lines of the file

ou seja, cada vez que ele acha o caractere \n ele vai quebrar a linha.
No caso, em meu exemplo bem especificamente falando, eu de propósito inseri uma linha em branco usando um "enter", seja lá o que esse ENTER vai gerar no meu linux. Mas uma coisa é certa, um espaço em branco é que ele não vai ter. Mesmo assim, essa questão do carcatere em branco não pode ser implementada, pois será possivel que ocorra que a linha a ser analisada comece com um espaço e em seguida tenham outros caracteres, o que mascararia um erro, pois uma linha válida não poderá começar com o espaço em branco, entende? Em outras palavras, a linha a ser analisada não poderá começar com um caractere em branco, porém, se começar, ela não poderá ser classificada como uma linha em branco.
Outro comentário bem oportuno para esta discussão é que os sistemas operacionais usados são específicos: o txt seria gerado em windows, seja qua versão for, e o mesmo txt seria analisado em linux, portanto já sabemos que carcateres seriam inseridos no final de uma linha, no caso "\r\n", segundo esse post: https://www.vivaolinux.com.br/topico/C-C++/EOF-e-quebra-de-linha-Windows-ee-Linux . Então, sabemos como deveremos trabalhar.

Fabiano Vasconcelos

unread,
Sep 16, 2016, 12:54:12 PM9/16/16
to Python Brasil
Olá, Flávio!

Você poderia explicar como funciona esse código que você postou? Ele não está claro pra mim.

Obrigado.

Fabiano Vasconcelos

unread,
Sep 16, 2016, 1:18:26 PM9/16/16
to Python Brasil
Colegas, apesar do esforço de vocês o meu problema ainda não foi solucionado. O problema não está com a sintaxe, pois se eu substituir o \n ou \r por um E ou P, dá certo. Por exemplo: tem 9 linhas começadas com P. Se eu colo o P em ...startwith('P') ele imprime "Linha em branco" as 9 vezes. O mesmo acontece com a letra E. Existem 6 linhas que começam com a letra E e ele imprime a string 6 vezes. Pelo que eu estou vendo o problema está com esse bendito caractere de quebra de linha. Já tentei usar de tudo: '\n', "\n", '\r', "\r", "\n\r", "\r\n", '\n\r', '\r\n' e nada! Tentei até usar os códigos unicode e não funcionou. Alguém saberia desvendar esse mistério?


Em segunda-feira, 12 de setembro de 2016 16:44:15 UTC-3, Fabiano Vasconcelos escreveu:

Diego Nascimento

unread,
Sep 18, 2016, 6:21:56 AM9/18/16
to python...@googlegroups.com
Oi Fabiano.

Para imprimir se a linha esta em banco ela tem que ser assim:

if line.strip() == "":
    print("linha em branco")

se quiser imprimir o numero da linha e  a frase "linha em branco", você pode colocar um contador

f = open("arquivo.txt", "r")

num_linha= 1
for line in f:
    if line.strip() == "":
        print(num_linha, "linha em branco")
    num_linha += 1


vai mostrar o numero da linha e o dizer que está em branco, aih vc vai verificando, tenta nos arquivos de linux e de windows

o startwith pega o começo da linha, eu acho que não seria a melhor forma de fazer para verificar se a linha está vazia.



--
--
------------------------------------
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-brasil+unsubscribe@googlegroups.com.

Fabiano Vasconcelos

unread,
Sep 19, 2016, 10:02:02 AM9/19/16
to Python Brasil
Já estou é com vergonha de postar aqui sobre esse mesmo problema. Acho que a maioria das pessoas já desistiu desse assunto. Ao mesmo tempo, estou achando muito estranho uma coisa aparentemente tão simples estar se mostrando uma coisa tão impingenta de se resolver.
Caro Diego, obrigado por postar a sua contribuição. Tentei fazer como você me mandou, mas ele simplesmente rodou sem apontar nenhum erro e sem o resultado esperado. Aí vai o fragmento do código:

fileObject = open('/home/newwave/projects/PafKit/anexoIV.txt', 'r')
.
.
.
def blankline():
for line in fileObject:
if line.strip() == "":

print("Linha em branco")

Está certo? Seria assim que você queria que eu fizesse?
De qualquer maneira aí vai o link do meu código inteiro, para que não haja sombra de dúvidas do que eu estou tentando fazer.


Uma curiosidade: o que faz exatamente a função strip? Pelo que eu estou lendo aqui ele RETIRA caracteres no início e no fim da string:

Description

The method strip() returns a copy of the string in which all chars have been stripped from the beginning and the end of the string (default whitespace characters).

Syntax

Following is the syntax for strip() method −

str.strip([chars]);

Parameters

  • chars -- The characters to be removed from beginning or end of the string.

Return Value

This method returns a copy of the string in which all chars have been stripped from the beginning and the end of the string.

Example

The following example shows the usage of strip() method.

#!/usr/bin/python

str = "0000000this is string example....wow!!!0000000";
print str.strip( '0' )

When we run above program, it produces following result −

this is string example....wow!!!

Mas aí é onde eu não estou entendendo! Eu não preciso que se retire nenhum caractere da string, entende? Eu só preciso que ele detecte que há uma linha em branco lá e que ele imprima um aviso, mais nada. Não estou entendendo porque em todo lugar onde eu peço ajuda as pessoas estão insistindo nessa função strip().
Outra coisa que não me entra na cabeça é: ora, uma linha em branco (não sendo ela no final do arquivo) não teria um caractere \n ou \r ou \r\n, dependendo do sistema operacional?

linha 1
linha 2
linha 3
[ \r\n ]
linha 5
.
.
.

Pois bem! No meu algorítimo tradicional, o que eu implementei no começo, quando eu peço que ele ache o caractere P, por exemplo, o qual tem umas 9 linhas no meu arquivo que começam com P, ele imprime normalmente, bonitinho, sem stress nenhum a "Linha em branco" as 9 vezes. Por é então que se eu coloco um caractere de linha em branco, seja ele \n, \r ou \r\n, o que suportamente existe quando você pula uma linha dando ENTER (ou eu estou errado?) ele não imprime nada de aviso?
Algumas pessoas, inclusive aqui, me disseram que eu estou iterando em cima de uma entidade errada. Confesso que eu ainda não captei o sentido disso, pois pra mim o algorítimo está certo, até porque dá certo com P e não dá com \n, \r, \r\n. Gostaria até de entender o raciocínio dos colegas que defendem essa tese.
Enfim, vou tentar fazer esse mesmo pedaço de código em C++ pra ver no que dá.
Obrigado pela paciência e cara-de-paumente ainda espero uma resposta, pessoas! kKKKKKKkkk Não é possível que eu não resolva isso até o final do mês.

Abraço a todos!



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

Marcelo Valle (BLOOMBERG/ LONDON)

unread,
Sep 19, 2016, 10:47:01 AM9/19/16
to python...@googlegroups.com
Fabiano, 

Nao consigo ver o codigo inteiro, pois pastebin eh bloqueado aqui. Tem como enviar em um gist? (https://gist.github.com/)

Por favor, pode dizer qual seria uma entrada para o programa e a saida esperada? Soh para eu entender o que nao funcionou.

Abracos,
Marcelo.

André Prado

unread,
Sep 19, 2016, 10:58:20 AM9/19/16
to python...@googlegroups.com
Uma string vazia em python eh considerado false..

>>> ''.strip()
''
>>> ' '.strip()
''
>>> '\n'.strip()
''
>>> '\r'.strip()
''
>>> '\n\r'.strip()
''

tudo isso esta retornando false.

entao um if not linha.strip() funciona para ver se uma linha esta em branco


Marcelo.


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


<< ideas don't deserve respect >>

--
--
------------------------------------
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-brasil+unsubscribe@googlegroups.com.

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



--
Atenciosamente/Regards
André Castelan Prado

Diego Nascimento

unread,
Sep 19, 2016, 10:59:20 AM9/19/16
to python...@googlegroups.com
Oi Fabiano.

strip apaga caracteres em branco, no início e fim da linha, se deve usar pq uma linha em branco pode ter caracteres variados, mas invisíveis, tipo o 'tab', 'espaço' ou qualquer outro que seja invisível.. se vc por exemplo tiver uma linha em branca mas com um caractere de espaço, ele não vai ser mais vazio, pq vai constar um caractere, quando você comparar o primeiro caractere com '\n' ele vai dar negativo pq vai achar o caractere do espaço e não do '\n', tipo '<espaço>\n' .. ficaria como vazio visivelmente, mas o primeiro caracter é o espaço.. então se usa o strip para ele apagar tudo o que tem de espaços em branco no começo e fim da linha, aih apaga espaços em branco, tabs e qualquer outro que fique em branco.. aí se não houver nenhuma letra escrita na linha, ela será igual a "" , que é duas aspas juntas.

vou respondendo por partes tah.. eh que está difícil as coisas aqui, vou analisar teu código e aih te ajudo a corrigir ele.



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

Diego Nascimento

unread,
Sep 19, 2016, 11:03:39 AM9/19/16
to python...@googlegroups.com
ops, já teve explicação melhor.. minha internet está terrível hoje =/

Diego Nascimento

unread,
Sep 19, 2016, 12:48:50 PM9/19/16
to python...@googlegroups.com
a parte do codigo que vc mandou, essa.

fileObject = open('/home/newwave/projects/PafKit/anexoIV.txt', 'r')

def blankline():
for line in fileObject:
if line.strip() == "":
print("Linha em branco")

# chamando a funcao.. funciona
blankline()

Ele imprime quando encontra a linha em branca, está correto.

Qual é a saída esperada?

Em 19 de setembro de 2016 11:02, Fabiano Vasconcelos <fvasco...@gmail.com> escreveu:


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

Fabiano Vasconcelos

unread,
Sep 19, 2016, 1:43:46 PM9/19/16
to Python Brasil, mvalle...@bloomberg.net
Ok, Marcelo, aí vai a sua URL: https://gist.github.com/anonymous/0731bc3dc0e14f06a467ebda8db8c1f0

A entrada é um arquivo txt e a saída é a análise desse arquivo, baseado em um padrão a ser seguido. Se o arquivo estiver nos padrões corretos o programa não retornará nenhum erro. Se não estiver, ele emitirá mensagens de erro. O erro que eu quero que ele analise no momento é uma maldita linha em branco, que não pode existir no arquivo.
Vou postar o arquivo zipado para não comprometer a formatação windows: http://jent.com.br/files/anexoIV.txt.zip

Muito obrigado pela dedicação!
No agurado!

Fabiano Vasconcelos

unread,
Sep 19, 2016, 1:59:59 PM9/19/16
to Python Brasil
def blankline():
       for line in fileObject: 
       if not line.strip():

print("Linha em branco")

Boa tarde, Castelan!
Seria assim?
<< ideas don't deserve respect >>

--
--
------------------------------------
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ê 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.



--
Atenciosamente/Regards
André Castelan Prado

Marcelo Valle (BLOOMBERG/ LONDON)

unread,
Sep 19, 2016, 2:04:16 PM9/19/16
to python...@googlegroups.com
Fabiano, 

Obrigado pelo codigo. Tem varias melhorias que dah para enxergar nele, mas a deteccao de linhas em branco deveria estar funcionando. 

Para saber o que nao estah funcionando, eu queria ver a sua entrada de dados, tem como voceh criar um gist com esse arquivo anexoIV?

Olhe abaixo como o `line.strip() == ""` funciona:

$ python
Python 2.7.12 (default, Aug 15 2016, 13:30:06)
[GCC 4.8.2 20140120 (Red Hat 4.8.2-15)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> f = open("/etc/passwd")
>>> fileObject = f.read()
>>> l1 = [line for line in fileObject]
>>> l2 = [line for line in fileObject]
>>> len(l1)
2472
>>> len(l2)
2472
>>> lblank = [line for line in fileObject if line.strip() == ""]
>>> len(lblank)
93
>>>



Abracos,
Marcelo.

Subject: Re: [python-brasil] Re: Como detectar uma linha em branco em um arquivo texto no linux que foi produzido no windows?

A entrada é um arquivo txt e a saída é a análise desse arquivo, baseado em um padrão a ser seguido. Se o arquivo estiver nos padrões corretos o programa não retornará nenhum erro. Se não estiver, ele emitirá mensagens de erro. O erro que eu quero que ele analise no momento é uma maldita linha em branco, que não pode existir no arquivo.
Vou postar o arquivo zipado para não comprometer a formatação windows: http://jent.com.br/files/anexoIV.txt.zip

Muito obrigado pela dedicação!
No agurado!

Em segunda-feira, 19 de setembro de 2016 11:47:01 UTC-3, Marcelo Elias Del Valle escreveu:

Fabiano Vasconcelos

unread,
Sep 19, 2016, 2:14:17 PM9/19/16
to Python Brasil
Então eu descobri que eu tenho outro problema, Diego. O arquivo também não pode começar com espaço, tab ou qualquer caractere invisível. Agora eu tô vendo que vou ter que implementar um código que detecte uma linha vazia pura, sem caratceteres invisíveis. no começo ou após. Por exemplo: se a linha teria que começar com:

P2XXXXX0000

e ela começa com

[espaço]P2XXXXX0000

esta linha já está incorreta, entende? E o erro deve ser retornado precisamente:

"Existem carcateres de espaço ou de tabulação na linha 09. Favor remova-os."

Diferente disso:

[espaço]"\n"

Onde de cara a linha teria que ser nula:

"Linha 34 em branco. Favor excluí-la"

Se a linha começar com um espaço, tab ou qualquer um desses caracteres que não são permitidos, então o programa já tem que reclamar, mesmo que depois que ele [o meu cliente] conserte o código que está gerando aquele caractere indevido sobre a "". Aí já seria outra história. Quando a gente escaneasse de novo o arquivo apareceria a linha vazia, sem espaços ou TABs.
Obrigado por reservar um tempo seu para resolver meu problema. Fico no aguardo do resto da resposta.

Abraço!

Luís Tavares

unread,
Sep 19, 2016, 2:22:34 PM9/19/16
to python...@googlegroups.com
Fabiano, 
Veja que o seu código já "lê" o arquivo no começo do programa, provavelmente, por isso você não está conseguindo o resultado esperado. 
Isso acontece quando você chama o primeiro "read" na linha 22 do teu script. 
Fiz o método da seguinte forma e retornou o resultado esperado:


Alguém já deu a sugestão, mas vale reforçar, tente utilizar expressão regular, acredito que para esse caso seja a melhor saída ainda. :)

Abs,

Luís Alberto Tavares Poli


Marcelo.


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


<< ideas don't deserve respect >>

--
--
------------------------------------
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-brasil+unsubscribe@googlegroups.com.

Diego Nascimento

unread,
Sep 19, 2016, 4:08:36 PM9/19/16
to python...@googlegroups.com
Fabiano, tenta fazer uma coisa diferente, faz uma função que verifica se a linha é branca e retorna true se sim, false se não, e faz o mesmo com a função que verifica se o primeiro caractere é em branco, mas a linha toda não é em branco. .. aih quando for ler linha a linha o teu arquivo, vc passa por essas funções.. vai resolvendo um problema por vez... veja, fiz essas duas funções.






Fabiano Vasconcelos

unread,
Sep 19, 2016, 6:47:27 PM9/19/16
to Python Brasil
Galerinha, entupiu aqui de mensagens! Kkkkk... Vou ler aqui uma a uma, pessoal! Muito obrigado pela paciência e pela solidariedade! Volto já pra comentar de uma por uma!

's!

Marcelo Valle (BLOOMBERG/ LONDON)

unread,
Sep 20, 2016, 6:06:07 AM9/20/16
to python...@googlegroups.com
Fabiano, 

Se eu puder te sugerir algo, evite a todo custo usar variaveis globais em seu programa. 

Outra dica, nao coloque codigo solto no meio do seu script, pois desse modo o codigo serah necessariamente executado quando voce importar o modulo de outro lugar. Ao inves disso, estruture seu programa para usar uma funcao main: https://docs.python.org/2/library/__main__.html

Ainda outra dica: utilize arg parse para fazer seu programa aceitar argumentos de linha de comando: https://docs.python.org/3/library/argparse.html
Entao ao inves de ter o nome do arquivo hardcoded, voceh deveria poder executar `programa.py arquivo_de_entrada.txt`

Olhe um programa de exemplo que aceita argumentos de linha da comando, nao tem variaveis globais e usa uma funcao main:

Nao precisa entender ao certo tudo o que faz o programa, o importante eh prestar atencao soh nesses 3 pontos. Voceh verah que fica bem mais facil raciocinar em cima do codigo quando voceh estrutura o mesmo de forma melhor.

Continue postando duvidas quando tiver. Boa sorte!

-Marcelo


--
--
------------------------------------
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ê 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.

Fabiano Vasconcelos

unread,
Sep 20, 2016, 3:30:45 PM9/20/16
to Python Brasil, mvalle...@bloomberg.net
Olá, Del Valle!
Boa tarde!

Muitíssimo obrigado pelas preciosíssimas dicas! Pelo seu jeito de interagir, você deve ser uma pesssoa de sucesso, pois duas das regras básicas e imutáveis do sucesso são:

a) Entregar mais do que foi demandado, deixando o cliente mais satisfeito do que ele pensava que iria ficar;
b) Se preocupar com o outro, prevendo, se antecipando o que ele gostaria de saber/ter.

Vou tirar um tempo para ler esses links que você me mandou com calma. Eu gostaria muito de ter feito esse lance aí do arg parse desde o começo, mas como eu não sabia exatamente como fazê-lo, acabei deixando de lado pra implementar depois. Agora que você já me mostrou o texto eu vou ter condições de implementar.
Obrigado também por se colocar a disposição e colocar a lista a disposição para responder as minhas dúvidas. Acho que esse meu tópico aqui foi resolvido, graças a Deus.

Grande abraço e fica com Deus!

Fabio C. Barrionuevo da Luz

unread,
Sep 20, 2016, 3:35:00 PM9/20/16
to python...@googlegroups.com
eu recomendo o http://click.pocoo.org/5/ para fazer interface de linha de comando.

Ele é um boa alternativa ao argparse. veja o porque: http://click.pocoo.org/5/why/



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

Fabiano Vasconcelos

unread,
Sep 20, 2016, 3:52:02 PM9/20/16
to python...@googlegroups.com
Pessoas, muito obrigado pela paciência e pela solução do problema.
Apesar do problema ter se resolvido de outra forma que não a que eu tinha em mente, ainda fico com a pulga atrás da orelha, sem entender o porquê daquele meu código não ter funcionado com algum dos caracteres de nova linha, mas ter funcionado com caracteres normais. Ainda bem que eu fui respaldado pelo colega acima quando disse que o programa era pra ter funcionado. Isso me tirou a sensação de incompetência. Até que me digam o que aconteceu, assumo isso como sendo um bug da linguagem.
Anderson, podexá que eu vou ver a solução em expressão regular! :)
Fabio, vou considerar a sua opção ao arg parse, obrigado pela contribuição.

Grande abraço a todos!


Fabiano Vasconcelos
[Technologist in Computer Networking]
Laboratory Technician in Computer
Technology Centre @ Federal University of Ceará
Fortaleza, CE, Brazil

Fabiano Vasconcelos
[Tecnólogo em Redes de Computadores]
Técnico de Laboratório em Informática
Centro de Tecnologia @ Universidade Federal do Ceará
Fortaleza, CE

Você recebeu essa mensagem porque está inscrito em um tópico no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse tópico, acesse https://groups.google.com/d/topic/python-brasil/ih7z1-E_RzM/unsubscribe.
Para cancelar inscrição nesse grupo e todos os seus tópicos, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.

Paul Eipper

unread,
Sep 21, 2016, 12:05:34 PM9/21/16
to python-brasil
Tente iterar sem o split e comparar a linha como um todo:

```
for i, line in enumerate(open('anexoIV.txt')):
if line in ['\n', '\r\n']:
print 'linha em branco:', i + 1

```

--
Paul Eipper

Marcelo Valle (BLOOMBERG/ LONDON)

unread,
Sep 21, 2016, 12:05:35 PM9/21/16
to python...@googlegroups.com
Fabiano, 

Para entender melhor sobre os espacos em brancos, o que estah te faltando nao eh conhecimento de Python em si, mas de char encoding. 

Tente procurar sobre o assunto no google, entender como dados sao armazenados em um arquivo de computador vai te ajudar a tirar essa pulga atras da orelha.

Alguns links uteis:


Abracos,
Marcelo.
--
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...

--
--
------------------------------------
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 em um tópico no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse tópico, acesse https://groups.google.com/d/topic/python-brasil/ih7z1-E_RzM/unsubscribe.
Para cancelar inscrição nesse grupo e todos os seus tópicos, envie um e-mail para python-brasi...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.
--
--
------------------------------------
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ê 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.

Luiz Armesto

unread,
Sep 21, 2016, 12:28:59 PM9/21/16
to python...@googlegroups.com

Vale também lembrar que python vem com baterias inclusas e tem o método splitlines https://docs.python.org/3/library/stdtypes.html#str.splitlines


--
--
------------------------------------
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ê está recebendo esta mensagem porque se inscreveu 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 obter mais opções, acesse https://groups.google.com/d/optout.
Reply all
Reply to author
Forward
0 new messages