обработка файлов в python - PullRequest
2 голосов
/ 06 мая 2009

Заранее спасибо. Я написал программу, которая работает для небольших файлов. Но это не работает для файлов размером 1 ГБ. Пожалуйста, скажите мне, есть ли способ обработки больших файлов. Вот код.

fh=open('reg.fa','r')
c=fh.readlines()
fh.close() 
s=''  
for i in range(0,(len(c))):  
    s=s+c[i]  
    lines=s.split('\n')
    for line in s:
            s=s.replace('\n','')
s=s.replace('\n','')          
print s 

Ответы [ 6 ]

17 голосов
/ 06 мая 2009

Метод readlines читает файл весь . Вы не хотите делать это для файла, который является большим по отношению к размеру вашей физической памяти.

Исправление - прочитать файл небольшими порциями и обработать их по отдельности. Вы можете, например, сделать что-то вроде этого:

for line in f.xreadlines():
    ... do something with the line

xreadlines возвращает не список строк, а итератор, который возвращает по одной строке за раз, когда его вызывает цикл for. Еще более простой способ сделать это:

for line in f:
    ... do something with the line

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

7 голосов
/ 06 мая 2009

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

for line in open("test.txt", "r"):
    # do something with the "line"
5 голосов
/ 06 мая 2009

С readlines () вы читаете весь файл одновременно, поэтому вы используете 1 ГБ памяти. Сделано в этой попытке:

f = open(...)
while 1:
   line = f.readline()
   if not line:
     break
   line = line.rstrip()
   ... do something with line
   ... 
f.close()

Если все, что вам нужно, это удалить \ n, не делайте это построчно, а делайте это с кусками текста:

import sys

f = open('query.txt','r')
while 1:
    part = f.read(1024)
    if not part:
        break
    part = part.replace('\n', '')
    sys.stdout.write(part)  
2 голосов
/ 06 мая 2009

Ваша программа очень избыточна. Похоже, все, что вы делаете, можно сделать с помощью этих строк:

import sys
for line in open('reg.fa'):
    sys.stdout.write(line.rstrip())

Этого достаточно. Эта программа дает тот же результат, что и исходный код в вопросе , но намного проще и понятнее. И он также может обрабатывать файлы любого размера.

0 голосов
/ 07 июля 2017
import sys
import os

Используйте режим wb +, если файл не создан, это создаст файл, а также запишет данные!

f = open('f_name.txt','wb+')
while 1:
    part = f.read(1024)
    if not part:
        break
    part = part.replace('\n', '')
    sys.stdout.write(part) 
 f.close()
0 голосов
/ 08 июня 2009

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

Вы могли использовать следующий фрагмент кода.

f = open (имя_файла, режим)

для строки в f:

"""

Do the processing 

"""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...