Как узнать количество строчек в файле с помощью Python
Способы подсчета строк в Python
Самый простой и надежный метод для большинства файлов - использовать генераторное выражение с sum.
with open('file.txt', 'r') as f:
count = sum(1 for line in f)
ввод программ на python (ввод данных в программе python)
Этот код открывает файл и считает количество итераций по строкам. Каждая строка занимает мало памяти, так как файл не загружается целиком. Метод подходит для файлов любого размера, вплоть до гигабайт.
Возможные проблемы и ошибки
- Файл не найден - ошибка FileNotFoundError. Путь можно проверить или применить try/except.
- Файл открыт в неверной кодировке - UnicodeDecodeError. Указывается encoding='utf-8' или другая подходящая кодировка.
- Файл очень большой, но sum(1 for line in f) все равно работает без загрузки в память.
Как посчитать строки с помощью readlines()?
Метод readlines() считывает все строки в список, затем len().
with open('file.txt') as f:
lines = f.readlines()
count = len(lines)
Python file io (ввод-вывод файлов в python)
Недостаток:
При больших файлах список занимает много памяти. Подходит для маленьких файлов (до нескольких десятков мегабайт).
Проблема: MemoryError при файлах размером более доступной оперативной памяти. Решение - использовать итератор (основной способ).
Как подсчитать строки с нумерацией через enumerate?
Использование enumerate для получения номера последней строки.
with open('file.txt') as f:
for count, line in enumerate(f, start=1):
pass
Python temp files (временные файлы в python)
После цикла переменная count содержит количество строк. Метод похож на sum, но дает возможность обработать каждую строку.
Ошибка: если файл пустой, count останется 0 (так как цикл не выполнится). В коде выше переменная count будет определена, но при пустом файле она не инициализируется. Лучше устанавливать count=0 перед циклом.
Как использовать системную команду wc -l в Linux?
Вызов внешней утилиты через os.popen или subprocess.
import os
result = os.popen('wc -l file.txt').read().strip()
count = int(result.split()[0])
Python index files (индексация файлов в python)
Преимущества:
Очень быстрый подсчет для больших файлов, так как wc оптимизирован. Недостатки: только Linux/Unix, зависимость от внешней команды.
Проблема: команда может отсутствовать в системе, или путь к файлу с пробелами - требуется экранирование. Целесообразно использовать subprocess.run с shell=False для безопасности.
Как подсчитать строки в огромном файле с помощью mmap?
memory-map (mmap) отображает файл в виртуальную память и позволяет считать символы новой строки.
import mmap
with open('file.txt', 'r+b') as f:
mm = mmap.mmap(f.fileno(), 0)
count = 0
while mm.find(b'\n') != -1:
mm.seek(mm.find(b'\n') + 1)
count += 1
mm.close()
File python class (класс для работы с файлами в python)
Более сложный код, но максимально производительный для файлов, которые не помещаются в оперативную память.
Ошибка: mmap доступен только на Unix и Windows, но на Windows могут быть ограничения. Также требуется корректное закрытие mmap. Для простоты чаще используют sum.
Как посчитать строки в CSV через pandas?
Если файл в формате CSV, можно загрузить его в DataFrame и узнать количество строк.
import pandas as pd
df = pd.read_csv('file.csv')
count = len(df)
Удобно, когда требуется дальнейшая обработка данных. Недостаток: загружает весь файл в память.
Проблема: при большом CSV может не хватить памяти. Можно применить chunksize для итеративного чтения.
Расширенные примеры подсчета строк
Подсчет непустых строк
with open('file.txt') as f:
non_empty = sum(1 for line in f if line.strip())
print(non_empty) # Вывод: 42
42
Подсчитываются только строки, содержащие хотя бы один непробельный символ.
Подсчет строк в нескольких файлах с суммированием
import glob
total = 0
for path in glob.glob('*.txt'):
with open(path) as f:
total += sum(1 for _ in f)
print(total) # Вывод: 157
157
Обходит все файлы с расширением .txt в текущей директории.
Подсчет строк в сжатом gzip-файле
import gzip
with gzip.open('file.txt.gz', 'rt', encoding='utf-8') as f:
count = sum(1 for _ in f)
print(count) # Вывод: 89
89
Файл распаковывается на лету, память не тратится на полную распаковку.
Подсчет строк без комментариев (строки, начинающиеся с #)
with open('config.ini') as f:
code_lines = sum(1 for line in f if not line.strip().startswith('#'))
print(code_lines) # Вывод: 28
28
Игнорирует строки, начинающиеся с символа решетки после удаления пробелов.
Подсчет строк с обработкой ошибок кодировки
try:
with open('file.txt', 'r', encoding='utf-8') as f:
count = sum(1 for _ in f)
except UnicodeDecodeError:
with open('file.txt', 'r', encoding='cp1251') as f:
count = sum(1 for _ in f)
print(count) # Вывод: 123
123
Пытается открыть файл в UTF-8, при ошибке переключается на cp1251.
Подсчет строк с использованием pathlib для рекурсивного обхода
from pathlib import Path
total = 0
for path in Path('logs').rglob('*.log'):
with open(path) as f:
total += sum(1 for _ in f)
print(total) # Вывод: 1001
1001
Рекурсивно перебирает все .log файлы в папке logs и подпапках.