Форум сайта python.su
0
Здравствуйте!
Есть ли в питоне возможность считать только одну конкретную строку из файла по ее номеру, не считывая всех предыдущих?
Полдня ищу в интернете ответ на этот вопрос, но найти ничего не получается. Все пытаются читать файл построчно до нахождения искомой строки. Но мне надо именно и только одну строку прочитать, а все остальные - нет!
Дело в том, что я пытаюсь обрабатывать текстовый файл размером 10Гб и операцию считывания строки мне надо повторить что-то где-то пару миллионов раз, если навскидку (если быть оптимистами, может оказаться, что 7-8 сотен тысяч)…. Если читать с начала файла и до нужной строки, это не долго и даже не ДОЛГО, а попросту ДОЛГО!
Есть ли какая-то возможность сразу перейти к нужной строке? Или стоит просто другой язык программирования использовать? ??
(строки разного размера все, и я знаю именно и только номер нужной, а не ее байтовую позицию в файле)
Отредактировано Alef (Июнь 5, 2015 18:34:15)
Офлайн
103
import linecache print linecache.getline('Test.txt', 4)
Офлайн
0
Пишет:
File "C:\Python34\lib\codecs.py", line 319, in decode (result, consumed) = self._buffer_decode(data, self.errors, final) UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc4 in position 516: invalid continuation byte
Офлайн
103
виндовс…
это проблема с выводом
сделайте без принта, прост в переменную
import linecache a = linecache.getline('Test.txt', 4)
with open('Test.txt') as f: for i in xrange(2000000): f.readline() print(f.readline())
Офлайн
0
Спасибо за помощь!
К сожалению, даже пропуск строк для меня слишком медленно: он может занимать до минуты, учитывая, что повторять это надо несколько сотен тысяч раз…. я даже сомневаюсь, что все это, запущенное на выходные, к понедельнику отработает
Изначально я такое использую:
def read_f(k,f): i = 0 while i < k: f.readline() i += 1
Отредактировано Alef (Июнь 5, 2015 19:52:40)
Офлайн
103
Alefизмените кодировку
Странно, что если создать файл в блокноте и с ним это все проделать - ошибки нет. А вот с этим 10-гиговым - вот такое…
Alefэто проблема
К сожалению, даже пропуск строк для меня слишком медленно: он может занимать до минуты, учитывая, что повторять это надо несколько сотен тысяч раз
with open('Test.txt') as f: for i, j in enumerate(f): if i == 200000: print(j) break
Отредактировано terabayt (Июнь 5, 2015 20:14:30)
Офлайн
0
Спасибо!!!
Я обязательно это попробую, только уже, пожалуй, на выходных) Что-то ничего не соображаю. Пыталась файл в utf-8 конвертнуть средствами самого питона, получился такой ужас, не передать… похоже, стоит перерыв сделать 
Да, я написала в почту, на всякий случай… )
Офлайн
857
AlefСтрока определяется признаком конца - одним или двумя символами. То есть строка - это просто последовательность символов, включающая признак конца. Символ может быть представлен разным количеством байт, которое зависит от символьной кодировки. (Например символ \n в кодировке utf-32 будет занимать 4 байта, а в utf-8 - 1 байт.)
Есть ли какая-то возможность сразу перейти к нужной строке?
Офлайн
253
AlefНемного дополню предыдущий ответ. Новый язык искать не стоит, потому что не существует никакого языка программирования который это позволит сделать. Файл операционной системы не содержит интерфейса для поиска строк.
Или стоит просто другой язык программирования использовать? ??
sqlite3.exe ex1.db
create table file_rows(a); .mode csv .separator "@" .import you_file_name file_rows
Офлайн
0
Огромное всем спасибо!
Удалось победить эти файлы, выписав отдельно байтовые позиции нужных строк (это ведь и называется индексами, или я что-то путаю?). Теперь оно практически летает
С базами данных тоже попробую, чисто из интереса, но задача разрешилась) Благодарю!
Офлайн