2012-05-20 16 views
7

deseo de contar el número de líneas en un archivo .txt que se ve algo como esto:Contar el número de líneas en un archivo txt con Python excluyendo las líneas en blanco

apple 
orange 
pear 

hippo 
donkey 

cuando existan líneas en blanco utilizados para separar bloques. El resultado que estoy buscando, basado en la muestra anterior, es cinco (líneas).

¿Cómo puedo lograrlo?

Como beneficio adicional, sería bueno saber cuántos bloques/párrafos hay. Entonces, basado en el ejemplo anterior, eso sería dos bloques.

+5

¿Tiene que ser pitón? 'grep. nombre de archivo | wc -l' te dará las líneas fácilmente. – Daenyth

+1

@Daenyth Es parte de un script de Python más grande, por lo que idealmente sí. – samiles

+0

@larsmans Ese es un enlace divertido.He estado buscando durante mucho tiempo, y he encontrado muchos ejemplos de cómo obtener las líneas, pero ninguna sobre cómo excluir espacios en blanco. – samiles

Respuesta

19
non_blank_count = 0 

with open('data.txt') as infp: 
    for line in infp: 
     if line.strip(): 
      non_blank_count += 1 

print 'number of non-blank lines found %d' % non_blank_count 

ACTUALIZACIÓN: Vuelva a leer la pregunta, OP quiere contar no están en blanco líneas .. (suspiro .. gracias @RanRag). (Necesito un descanso de la computadora ...)

+0

Creo que quería decir 'con open ('data.txt') como infp:' – mgilson

+2

Esto no funciona. Una línea en blanco se devuelve como '" \ n "', no '" "'. –

+0

@mgilson Estaba editando esto mientras hacía su comentario, ¡gracias! – Levon

3

Un camino corto para contar el número de líneas en blanco no podía ser:

with open('data.txt', 'r') as f: 
    lines = f.readlines() 
    num_lines = len([l for l in lines if l.strip(' \n') != '']) 
0

no líneas en blanco Contador:

lines_counter = 0 

with open ('test_file.txt') as f: 
    for line in f: 
     if line != '\n': 
      lines_counter += 1 

bloques contadores:

para_counter = 0 
prev = '\n' 

with open ('test_file.txt') as f: 
    for line in f: 
     if line != '\n' and prev == '\n': 
      para_counter += 1 
     prev = line 
0

Este trozo de código Python debería resolver su problema:

with open('data.txt', 'r') as f: 
    lines = len(list(filter(lambda x: x.strip(), f))) 
+0

¿Por qué el 'filter' y' map'? ¿No podría simplemente hacer: 'filter (lambda x: x.strip(), f)' – mgilson

+0

@mgilson: jaja, buen punto, no estaba pensando: P –

+1

No sé si alguna vez tuve una buena razón para 'Importar cadena' :) – mgilson

0

Esta es la forma en que habría hecho:

f = open("file.txt") 
l = [x for x in f.readlines() if x != "\n"] 

print len(l) 

readlines() hará una lista de todas las líneas en el archivo y entonces sólo puede tomar esas líneas que tienen al menos algo en ellos. ¡Parece bastante sencillo para mí!

0

¡Bastante heterosexual! Creo

f = open('path','r') 
count = 0 
for lines in f: 
    if lines.strip(): 
     count +=1 
print count 
1
sum([1 for i in open("file_name","r").readlines() if i.strip()]) 
0

Teniendo en cuenta las líneas en blanco solamente contendrá el carácter de nueva línea, que sería bastante rápido para evitar llamar str.strip que crea una nueva cadena, pero en lugar de comprobar si la línea contiene sólo espacios utilizando str.isspace y luego saltar:

with open('data.txt') as f: 
    non_blank_lines = sum(not line.isspace() for line in f) 

demostración:

from io import StringIO 

s = '''apple 
orange 
pear 

hippo 
donkey''' 

non_blank_lines = sum(not line.isspace() for line in StringIO(s))) 
# 5 

Se puede utilizar más str.isspace con itertools.groupby para contar el número de bloques contiguos líneas/en el archivo:

from itertools import groupby 

no_paragraphs = sum(k for k, _ in groupby(StringIO(s), lambda x: not x.isspace())) 
print(no_paragraphs) 
# 2 
Cuestiones relacionadas