Как подсчитать общее количество строк в текстовом файле с помощью python

Например, если мой текстовый файл:

blue
green
yellow
black

Здесь есть четыре строки, и теперь я хочу получить результат как четыре. Как я могу это сделать?

Ответ 1

Вы можете использовать sum() с выражением генератора:

with open('data.txt') as f:
    print sum(1 for _ in f)

Обратите внимание, что вы не можете использовать len(f), так как f является iterator. _ - это специальное имя переменной для переменных throwaway, см. Какова цель единственного подчеркивания "_" переменная в Python?.

Вы можете использовать len(f.readlines()), но это создаст дополнительный список в памяти, который даже не будет работать с огромными файлами, которые не вписываются в память.

Ответ 2

Эта ссылка (Как получить дешевый график в Python?) имеет множество потенциальных решений, но все они игнорируют один из способов сделать этот запуск значительно быстрее, а именно используя небуферизованный (необработанный) интерфейс, используя bytearrays и делая свою собственную буферизацию.

Используя модифицированную версию инструмента синхронизации, я считаю, что следующий код быстрее (и чуть более pythonic), чем любое из предлагаемых решений:

def _make_gen(reader):
    b = reader(1024 * 1024)
    while b:
        yield b
        b = reader(1024*1024)

def rawpycount(filename):
    f = open(filename, 'rb')
    f_gen = _make_gen(f.raw.read)
    return sum( buf.count(b'\n') for buf in f_gen )

Вот мои тайминги:

rawpycount        0.0048  0.0046   1.00
bufcount          0.0074  0.0066   1.43
wccount             0.01    0.01   2.17
itercount          0.014   0.014   3.04
opcount            0.021    0.02   4.43
kylecount          0.023   0.021   4.58
simplecount        0.022   0.022   4.81
mapcount           0.038   0.032   6.82

Я бы разместил его там, но я являюсь относительно новым пользователем для обмена пакетами и не имею требуемой манны.

ИЗМЕНИТЬ:

Это можно сделать полностью с выражениями генераторов in-line, использующими itertools, но это выглядит довольно странно:

from itertools import (takewhile,repeat)

def rawbigcount(filename):
    f = open(filename, 'rb')
    bufgen = takewhile(lambda x: x, (f.raw.read(1024*1024) for _ in repeat(None)))
    return sum( buf.count(b'\n') for buf in bufgen if buf )

Ответ 3

Вы можете использовать sum() с выражением генератора. Выражение генератора будет [1, 1, ...] до длины файла. Затем мы вызываем sum(), чтобы добавить их все вместе, чтобы получить общее количество.

with open('text.txt') as myfile:
    count = sum(1 for line in myfile)

Кажется, что вы пытались, чтобы вы не хотели включать пустые строки. Затем вы можете:

with open('text.txt') as myfile:
    count = sum(1 for line in myfile if line.rstrip('\n'))

Ответ 4

count=0
with open ('filename.txt','rb') as f:
    for line in f:
        count+=1

print count

Ответ 5

Один вкладыш:

total_line_count = sum(1 for line in open("filename.txt"))

print(total_line_count)

Ответ 6

это также дает отсутствие строк в файле.

a=open('filename.txt','r')
l=a.read()
count=l.splitlines()
print(len(count))

Ответ 7

Использование:

num_lines = sum(1 for line in open('data.txt'))
print(num_lines)

Это будет работать.

Ответ 8

Для людей, говорящих, чтобы использовать with open ("filename.txt","r") as f, вы можете сделать anyname = open("filename.txt","r")

def main():

    file = open("infile.txt",'r')
    count = 0
    for line in file:
            count+=1

    print (count)

main ()

Ответ 9

вот как вы можете это сделать с помощью понимания списка, но это немного портит память вашего компьютера, так как line.strip() вызывается дважды.

     with open('textfile.txt') as file:
lines =[
            line.strip()
            for line in file
             if line.strip() != '']
print("number of lines =  {}".format(len(lines)))

Ответ 10

Я не новичок в stackoverflow, просто не имел учетной записи и обычно приходил сюда для ответов. Я еще не могу прокомментировать или проголосовать за ответ. НО хотел сказать, что код от Майкла Бэкона выше работает очень хорошо. Я новичок в Python, но не для программирования. Я читал Python Crash Course, и есть несколько вещей, которые я хотел сделать, чтобы разбить крышку для чтения, чтобы охватить подход. Одной утилитой, использующей с точки зрения ETL или даже качества данных, было бы захват количества строк файла независимо от любого ETL. Файл имеет X количество строк, вы импортируете в SQL или Hadoop, и вы получаете X количество строк. Вы можете проверить на самом низком уровне количество строк файла необработанных данных.

Я играл с его кодом и делал некоторые тесты, и этот код очень эффективен до сих пор. Я создал несколько различных CSV файлов, различных размеров и строк. Вы можете увидеть мой код ниже, и мои комментарии содержат время и подробности. В приведенном выше коде Майкл Бэкон работает примерно в 6 раз быстрее, чем обычный метод Python для простого цикла линий.

Надеюсь, это поможет кому-то.


 import time
from itertools import (takewhile,repeat)

def readfilesimple(myfile):

    # watch me whip
    linecounter = 0
    with open(myfile,'r') as file_object:
        # watch me nae nae
         for lines in file_object:
            linecounter += 1

    return linecounter

def readfileadvanced(myfile):

    # watch me whip
    f = open(myfile, 'rb')
    # watch me nae nae
    bufgen = takewhile(lambda x: x, (f.raw.read(1024 * 1024) for _ in repeat(None)))
    return sum(buf.count(b'\n') for buf in bufgen if buf)
    #return linecounter


# ************************************
# Main
# ************************************

#start the clock

start_time = time.time()

# 6.7 seconds to read a 475MB file that has 24 million rows and 3 columns
#mycount = readfilesimple("c:/junk/book1.csv")

# 0.67 seconds to read a 475MB file that has 24 million rows and 3 columns
#mycount = readfileadvanced("c:/junk/book1.csv")

# 25.9 seconds to read a 3.9Gb file that has 3.25 million rows and 104 columns
#mycount = readfilesimple("c:/junk/WideCsvExample/ReallyWideReallyBig1.csv")

# 5.7 seconds to read a 3.9Gb file that has 3.25 million rows and 104 columns
#mycount = readfileadvanced("c:/junk/WideCsvExample/ReallyWideReallyBig1.csv")


# 292.92 seconds to read a 43Gb file that has 35.7 million rows and 104 columns
mycount = readfilesimple("c:/junk/WideCsvExample/ReallyWideReallyBig.csv")

# 57 seconds to read a 43Gb file that has 35.7 million rows and 104 columns
#mycount = readfileadvanced("c:/junk/WideCsvExample/ReallyWideReallyBig.csv")


#stop the clock
elapsed_time = time.time() - start_time


print("\nCode Execution: " + str(elapsed_time) + " seconds\n")
print("File contains: " + str(mycount) + " lines of text.")