Найти - Пользователи
Полная версия: Как узнать номер последней строки файла?
Начало » Python для новичков » Как узнать номер последней строки файла?
1 2
Bjiq
пока так сделал, но я думаю можно улучшить код, если учесть, что иногда файл может весит больше 5 Мб (600 000 строк)
     def search_last_line(self):
        last_line = None
        for num, line in enumerate(self.open_file_to_read(), 0):
            last_line = num
        return last_line
Slow
при всем уважениии, быстрее, чем “дернуть субпроцессом ‘wc’ за ‘-l’” вы вряд ли напишете
PEHDOM
вот тут люди задаются тем же вопросом
https://stackoverflow.com/questions/845058/how-to-get-line-count-cheaply-in-python
я там насчитал с десяток способов берешь пару тройку файлов разного размера, от пары килобайт до сотни МБ и проганяешь все способы измеряя время таймит-ом.
damilkrose
Если нужна скорость - юзай многопотоковое программирование - юзай threading. По крайней мере производительность и скорость моей программы(не скажу какой) увеличилась в x2.5 раз при том, что прога работала в 2-ух потоках, а не в 1-ом(мэйновском потоке).
Bjiq
Спасибо большое всем
JOHN_16
damilkrose
ну и как вам блин ваш совет поможет автору? КАК ?
damilkrose
JOHN_16
КАК ?
Под советом “используй threading” я имел в виду, bjiq, что ты можешь сделать свою прогу работающей в нескольких потоках. Подробнее: https://habrahabr.ru/post/149420/
Надо просто содержимое файла по возможности разделить на 2 части для 2-ух потоков.

А твой вариант совсем не плох.
FishHook
damilkrose
Объясни на пальцах. Вот есть у нас файл, надо узнать количество строк. Вопрос № 1: как не зная размер файла разбить его на две части? Вопрос № 2: что конкретно должен делать поток № 1 с частью файла № 1.
damilkrose
FishHook
Объясни на пальцах. Вот есть у нас файл, надо узнать количество строк. Вопрос № 1: как не зная размер файла разбить его на две части?
Размер узнать не так сложно:
 import os
size_of_file = os.path.getsize(путь_к_файлу) # размер файла в байтах.
С текстом проще все делается. если он говорит надо узнать кол. строк - значит, он имеет в виду текст.
 with open("name.txt", "r") as file:
    lines = len(file.read().split())
if not lines % 2:
    part1 = lines[:(lines/2)
    part2 = lines[(lines/2):]
else:
    part1 = lines[:(lines/2+0.5)] # даем 1-ой части на 1 строку больше
    part2 = lines[(lines/2-0.5):] # А второй - меньше
# part1 - это первая половина текста в файле
# part2 - это вторая половина

FishHook
Вопрос № 2: что конкретно должен делать поток № 1 с частью файла № 1
Сделать тоже, что и автор вопроса, только не со всем файлом:
Bjiq
self.open_file_to_read()
А по частям для каждого потока. Так дело пойдет гораздо быстрее. И размер тут не имеет особого значения если в деле говориться о строках

P. S. Написал что думаю. Если не прав в чем-то - пожалуйста докажи, и я извинюсь.


PEHDOM
damilkrose
  
with open("name.txt", "r") as file:
    lines = len(file.read().split())
Я конечно дико извиняюсь, но какой смысл во всем остальном коде после этих строк, с учетом постановки задачи тописктартером?
Плюс чтение всего файл в память не добавит быстродействия при достаточно большом файле.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB