Splitlines python посчитать количество строк

Метод splitlines() в Python

Метод splitlines() разбивает строку по разрывам строки и возвращает список строк в строке.

Параметры

  • keepends (необязательно) ‒ если keepends предоставлено и True, разрывы строк также включаются в элементы списка.

По умолчанию разрывы строк не включаются.

Возвращаемое значение

Модуль возвращает список строк в строке. Если символов разрыва строки нет, возвращается список с одним элементом (одной строкой).

Модуль разбивается на следующие границы строк:

Представление Описание
\n Перевод строки
\r Возврат каретки
\r\n Возврат каретки + перевод строки
\v или \x0b Табулирование строк
\f или \x0c Подача формы
\x1c Разделитель файлов
\x1d Разделитель групп
\x1e Разделитель записей
\x85 Следующая строка (контрольный код C1)
\u2028 Разделитель строк
\u2029 Разделитель абзацев

Пример: Как работает?

grocery = 'Milk\nChicken\r\nBread\rButter' print(grocery.splitlines()) print(grocery.splitlines(True)) grocery = 'Milk Chicken Bread Butter' print(grocery.splitlines())
['Milk', 'Chicken', 'Bread', 'Butter'] ['Milk\n', 'Chicken\r\n', 'Bread\r', 'Butter'] ['Milk Chicken Bread Butter']

Источник

Определить количество строк в строковой переменной

Строковые переменные имеют метод splitlines , который можно использовать для разбиения на строки. При этом будут правильно обработаны различные способы разбиения на строки и крайние случаи с наличием переноса строки в конце:

def lines_count(s): return len(s.splitlines()) 

Тем не менее, в этом случае создаётся временный список, который может быть довольно большим.

Если использовать метод count , то нужно проверять наличие переноса строки на конце:

def lines_count(s): if not s: return 0 count = s.count('\n') if not s.endswith('\n'): count += 1 return count 

Здесь распознаются только символы \n , но не создаётся список.
К сожалению, добавить распознавание всех случаев из splitlines довольно трудоёмко.

Насколько я понимаю, в стандартной библиотеке Python нет функции, объединяющей достоинства обоих методов.

Все утро читал ваш пост. Если вам нужно разделять строковую переменную(на подстроки) типа str по символу ‘\n’, то у вас же все решено. Кол-во ‘\n’ и будет кол-м подстрок. Если разделитель будет что-то иное, тогда считать иное. Если разделять исходную строку и получать список, в котором нужно еще иметь и символ ‘\n’, тогда ‘ ‘. ‘.splitlines(keepends=True). Если не устраивает слишком большой получаемый список(памяти много отъедается?), тогда встроить код на «с» и исп. символьный массив и указатели. Думаю, вы сами все это знаете. Но тогда я так и не понял, в чем суть вопроса.

О «здесь распознаются только символы \n»: по умолчанию текстовые потоки ( open() ) в Питоне используют «universal newline mode» это значит, что распознаются \r \n \r\n как окончания строк и возвращается только \n. То есть обычно после чтения только \n остаются в строке, поэтому wc_line_count = lambda s: s.count(‘\n’) или ваше определение: line_count = lambda s: len(s) and s.count(‘\n’) + (not s.endswith(‘\n’)) работает часто на практике.

str.splitlines() больше символов в качестве новой строки считает, к примеру: \f, \v. Если хочется это поведение, то можно регулярные выражения использовать (хотя было бы удобно, если count принимал бы tuple нескольких строк, как это endswith() делает, тогда можно было бы передать вместо \n, набор символов, которые мы хотим рассматривать новыми строками): splitlines_line_count = lambda s: sum(1 for _ in re.finditer(r»\n|\f|\v|. «, s))

вариаций на тему может быть много, не ясно что делать с вопросами автора 1) «этом случае создаётся временный список, который может быть довольно большим» и 2)»Насколько я понимаю, в стандартной библиотеке Python нет функции, объединяющей достоинства обоих методов», кроме того, механизм regexp и так сам по себе медлителен и его стараются избегать в обработке больших блоков данных(экспон. рост по мере увеличения сложности шаблона обработки, если быть точным). А у автора и так проблема больших списков, как я понял.

Источник

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

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

ОТВЕТЫ

Ответ 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.") 

Источник

Читайте также:  Python no module named main
Оцените статью