Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 23, 2014 21:29:17

russian_bear
Зарегистрирован: 2014-09-23
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

чтение текстового файла в массив

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

заранее спасибо

Офлайн

#2 Сен. 23, 2014 21:47:20

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

чтение текстового файла в массив

Нужно больше конкретики.

with open('mybigfile.txt', 'r') as big_file:
    array_of_strings = big_file.read().split('\n')

Офлайн

#3 Сен. 23, 2014 22:15:59

russian_bear
Зарегистрирован: 2014-09-23
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

чтение текстового файла в массив

Alen
Нужно больше конкретики.
ок, понятно, спасибо. А как обратиться допустим к 5 строке и заменить ее на “бла-бла-бла” ?

Офлайн

#4 Сен. 23, 2014 22:25:41

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

чтение текстового файла в массив

russian_bear
А как обратиться допустим к 5 строке и заменить ее на “бла-бла-бла” ?

array_of_string[4] = 'bla-bla-bla'

Офлайн

#5 Сен. 23, 2014 22:26:57

russian_bear
Зарегистрирован: 2014-09-23
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

чтение текстового файла в массив

Alen
спасибо, друг. И последний вопрос - как этот измененный массив сохранить на диск с другим именем ?

Офлайн

#6 Сен. 23, 2014 23:22:46

alexsis
Зарегистрирован: 2013-07-26
Сообщения: 148
Репутация: +  9  -
Профиль   Отправить e-mail  

чтение текстового файла в массив

Открываете новый файл и в него записываете командой write.

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

https://docs.python.org/2/tutorial/inputoutput.html

Офлайн

#7 Сен. 24, 2014 01:35:31

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9879
Репутация: +  853  -
Профиль   Отправить e-mail  

чтение текстового файла в массив

Есть пара методов, предназначенных для чтения/записи строк: .readlines() и .writelines()
Но читать весь файл в список не принято. Надо стараться читать построчно, чтобы можно было обрабатывать файлы любой длины без затрат на память.



Офлайн

#8 Сен. 24, 2014 06:08:53

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

чтение текстового файла в массив

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

Разница в скорости между read и readline на больших файлах, например в 100Мб раз этак в 100, а то и более. Поэтому read будет предпочтительней если вы точно знаете, что памяти хватит, если нет — то медленно и печально с помощью readline.

Офлайн

#9 Сен. 24, 2014 06:42:32

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9879
Репутация: +  853  -
Профиль   Отправить e-mail  

чтение текстового файла в массив

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]$



Отредактировано py.user.next (Сен. 25, 2014 00:21:41)

Офлайн

#10 Сен. 24, 2014 21:08:06

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

чтение текстового файла в массив

py.user.next
В три раза:

O(n) / O(log(n)) раз в вашем случае с nop/pass.
И в O(n^2) / O(n) в случае если со строками производятся операции.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version