Как получить количество строк дешево в 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 ]

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

Результатом открытия файла является итератор, который можно преобразовать в последовательность, имеющую длину:

with open(filename) as f:
   return len(list(f))

это более лаконично, чем ваш явный цикл, и избегает enumerate.

3 голосов
/ 12 марта 2011

count = max(enumerate(open(filename)))[0]

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

Как насчет этого

def file_len(fname):
  counts = itertools.count()
  with open(fname) as f: 
    for _ in f: counts.next()
  return counts.next()
3 голосов
/ 28 августа 2014

Если кто-то хочет дешево подсчитать количество строк в Python в Linux, я рекомендую этот метод:

import os
print os.popen("wc -l file_path").readline().split()[0]

file_path может быть как абстрактный путь к файлу или относительный путь. Надеюсь, что это может помочь.

2 голосов
/ 03 июня 2014
def line_count(path):
    count = 0
    with open(path) as lines:
        for count, l in enumerate(lines, start=1):
            pass
    return count
2 голосов
/ 19 июля 2011

Как насчет этого?

import fileinput
import sys

counter=0
for line in fileinput.input([sys.argv[1]]):
    counter+=1

fileinput.close()
print counter
2 голосов
/ 03 октября 2013

Как насчет этого однострочного:

file_length = len(open('myfile.txt','r').read().split('\n'))

Использование этого метода занимает 0,003 с, чтобы синхронизировать его с файлом строки 3900

def c():
  import time
  s = time.time()
  file_length = len(open('myfile.txt','r').read().split('\n'))
  print time.time() - s
0 голосов
/ 30 июля 2018

Создайте исполняемый файл сценария с именем count.py:

#!/usr/bin/python

import sys
count = 0
for line in sys.stdin:
    count+=1

А затем передать содержимое файла в скрипт Python: cat huge.txt | ./count.py. Труба работает также на Powershell , так что вы будете считать количество линий.

Для меня в Linux это было на 30% быстрее, чем:

count=1
with open('huge.txt') as f:
    count+=1
0 голосов
/ 19 января 2018

Если файл может уместиться в память, тогда

with open(fname) as f:
    count = len(f.read().split(b'\n')) - 1
0 голосов
/ 17 декабря 2017
def count_text_file_lines(path):
    with open(path, 'rt') as file:
        line_count = sum(1 for _line in file)
    return line_count
...