Форум сайта python.su
друзья, помогите пожалуйста новичку, подскажите простейший способ прочтения большого текстового файла с диска. Т.е. допустим есть текстовый файл из нескольких тысячь строк, и нужно прочитать его в массив, далее будет некая обработка/замена и далее этот массив записать в новый текстовый файл на диск.
заранее спасибо
Офлайн
Нужно больше конкретики.
with open('mybigfile.txt', 'r') as big_file: array_of_strings = big_file.read().split('\n')
Офлайн
Alenок, понятно, спасибо. А как обратиться допустим к 5 строке и заменить ее на “бла-бла-бла” ?
Нужно больше конкретики.
Офлайн
russian_bear
А как обратиться допустим к 5 строке и заменить ее на “бла-бла-бла” ?
array_of_string[4] = 'bla-bla-bla'
Офлайн
Alenспасибо, друг. И последний вопрос - как этот измененный массив сохранить на диск с другим именем ?
Офлайн
Открываете новый файл и в него записываете командой write.
>>> f = open('workfile', 'r+') >>> f.write('0123456789abcdef')
Офлайн
Есть пара методов, предназначенных для чтения/записи строк: .readlines() и .writelines()
Но читать весь файл в список не принято. Надо стараться читать построчно, чтобы можно было обрабатывать файлы любой длины без затрат на память.
Офлайн
py.user.next
Есть пара методов, предназначенных для чтения/записи строк: .readlines() и .writelines()
Но читать весь файл в список не принято. Надо стараться читать построчно, чтобы можно было обрабатывать файлы любой длины без затрат на память.
Офлайн
Alen
Разница в скорости между read и readline на больших файлах, например в 100Мб раз этак в 100, а то и более.
#!/usr/bin/env python3 import timeit def f1(): with open('file.txt') as fin: fin.read() def f2(): with open('file.txt') as fin: for _ in fin: pass def main(): t1 = timeit.Timer('f1()', 'from __main__ import f1') t2 = timeit.Timer('f2()', 'from __main__ import f2') for t in t1, t2: print(t.repeat(3, 5)) if __name__ == '__main__': main()
[guest@localhost readlines]$ head -3 file.txt
one two three four five six seven
one two three four five six seven
one two three four five six seven
[guest@localhost readlines]$ wc -l file.txt
6165478 file.txt
[guest@localhost readlines]$ stat -c %s file.txt
209626252
[guest@localhost readlines]$
[guest@localhost readlines]$ ./timecmp.py
[1.6103930499994021, 1.6278253110003789, 1.5783134789999167]
[4.757401738000226, 4.788496722000673, 4.74195558700012]
[guest@localhost readlines]$
#!/usr/bin/env python3 import timeit def f1(): with open('file.txt') as fin: fin.read().split('\n') def f2(): with open('file.txt') as fin: for _ in fin: pass def main(): t1 = timeit.Timer('f1()', 'from __main__ import f1') t2 = timeit.Timer('f2()', 'from __main__ import f2') for t in t1, t2: print(t.repeat(3, 5)) if __name__ == '__main__': main()
[guest@localhost readlines]$ ./timecmp.py
[5.052329235999423, 5.18557034100013, 5.0736290980003105]
[4.788822866001283, 4.763918844999353, 4.774715057999856]
[guest@localhost readlines]$
Отредактировано py.user.next (Сен. 25, 2014 00:21:41)
Офлайн
py.user.next
В три раза:
Офлайн