Найти - Пользователи
Полная версия: чтение текстового файла в массив
Начало » Python для новичков » чтение текстового файла в массив
1 2
russian_bear
друзья, помогите пожалуйста новичку, подскажите простейший способ прочтения большого текстового файла с диска. Т.е. допустим есть текстовый файл из нескольких тысячь строк, и нужно прочитать его в массив, далее будет некая обработка/замена и далее этот массив записать в новый текстовый файл на диск.

заранее спасибо
Alen
Нужно больше конкретики.

with open('mybigfile.txt', 'r') as big_file:
    array_of_strings = big_file.read().split('\n')
russian_bear
Alen
Нужно больше конкретики.
ок, понятно, спасибо. А как обратиться допустим к 5 строке и заменить ее на “бла-бла-бла” ?
Alen
russian_bear
А как обратиться допустим к 5 строке и заменить ее на “бла-бла-бла” ?

array_of_string[4] = 'bla-bla-bla'
russian_bear
Alen
спасибо, друг. И последний вопрос - как этот измененный массив сохранить на диск с другим именем ?
alexsis
Открываете новый файл и в него записываете командой write.

>>> f = open('workfile', 'r+')
>>> f.write('0123456789abcdef')

https://docs.python.org/2/tutorial/inputoutput.html
py.user.next
Есть пара методов, предназначенных для чтения/записи строк: .readlines() и .writelines()
Но читать весь файл в список не принято. Надо стараться читать построчно, чтобы можно было обрабатывать файлы любой длины без затрат на память.
Alen
py.user.next
Есть пара методов, предназначенных для чтения/записи строк: .readlines() и .writelines()
Но читать весь файл в список не принято. Надо стараться читать построчно, чтобы можно было обрабатывать файлы любой длины без затрат на память.

Разница в скорости между read и readline на больших файлах, например в 100Мб раз этак в 100, а то и более. Поэтому read будет предпочтительней если вы точно знаете, что памяти хватит, если нет — то медленно и печально с помощью readline.
py.user.next
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]$


Add
Добавил .split('\n') - вариант с .read() стал медленнее.

#!/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]$
Alen
py.user.next
В три раза:

O(n) / O(log(n)) раз в вашем случае с nop/pass.
И в O(n^2) / O(n) в случае если со строками производятся операции.
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