Как получить количество строк дешево в Python? - PullRequest
874 голосов
/ 10 мая 2009

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

На данный момент я делаю:

def file_len(fname):
    with open(fname) as f:
        for i, l in enumerate(f):
            pass
    return i + 1

можно ли сделать что-нибудь лучше?

Ответы [ 37 ]

0 голосов
/ 10 мая 2009

Почему бы не прочитать первые 100 и последние 100 строк и оценить среднюю длину строки, а затем разделить общий размер файла на эти числа? Если вам не нужно точное значение, это может сработать.

0 голосов
/ 05 декабря 2010

Почему бы не работать следующее?

import sys

# input comes from STDIN
file = sys.stdin
data = file.readlines()

# get total number of lines in file
lines = len(data)

print lines

В этом случае функция len использует входные строки в качестве средства определения длины.

0 голосов
/ 27 января 2015

Другая возможность:

import subprocess

def num_lines_in_file(fpath):
    return int(subprocess.check_output('wc -l %s' % fpath, shell=True).strip().split()[0])
0 голосов
/ 02 ноября 2014

Вы можете использовать модуль os.path следующим образом:

import os
import subprocess
Number_lines = int( (subprocess.Popen( 'wc -l {0}'.format( Filename ), shell=True, stdout=subprocess.PIPE).stdout).readlines()[0].split()[0] )

, где Filename - абсолютный путь к файлу.

0 голосов
/ 09 августа 2018

Если все строки в вашем файле имеют одинаковую длину (и содержат только символы ASCII) *, вы можете сделать следующее очень дешево:

fileSize     = os.path.getsize( pathToFile )  # file size in bytes
bytesPerLine = someInteger                    # don't forget to account for the newline character
numLines     = fileSize // bytesPerLine

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

0 голосов
/ 25 июня 2010

что по этому поводу?

import sys
sys.stdin=open('fname','r')
data=sys.stdin.readlines()
print "counted",len(data),"lines"
0 голосов
/ 05 сентября 2013

Аналогично:

lines = 0
with open(path) as f:
    for line in f:
        lines += 1
...