читать очень очень большой файл с Python - PullRequest
2 голосов
/ 10 марта 2011

Как лучше всего обработать каждую строку текстового файла, размер которого составляет около 500 МБ?

Предложение, о котором я подумал:

def files(mon_fichier):
    while True:
        data = mon_fichier.read(1024)
        if not data:
            break
        yield data

fichier = open('tonfichier.txt', 'r')
for bloc in files(fichier):
    print bloc

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

Ответы [ 4 ]

11 голосов
/ 10 марта 2011
with open('myfile.txt') as inf:
    for line in inf:
        # do something
        pass
7 голосов
/ 10 марта 2011

Простое использование стандартных файловых операций должно работать до тех пор, пока вы держитесь подальше от readlines и вместо этого просто используете readline.

1 голос
/ 10 марта 2011

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

fs = open(source, 'r')
while 1:
    txt = fs.readline(1000)
    < your treatement>
    if txt =="":
    break
fs.close()
0 голосов
/ 10 марта 2011

Насколько я понимаю процессы, чтение файла идет через буфер.

В этом состоянии mon_fichier.read(1024) извлекает не 1024 байта непосредственно из файла, а из буфера, пока этот файл не будет исчерпан, а затем буфер будет снова заполнен новым реальным чтением, скажем,, 4096 или 8192 или 16384 или ... байтов, я не знаю точно (думаю, что это степень 2, но даже не уверен)

Тогда, если вы действительно хотите обрабатывать блоки байтов, ядумаю, что код филнекста предпочтительнее.Но readline(1000) необходимо заменить на read(1000), если вы хотите получить ровно 1000 байтов;readline(1000) возвращает строку и не более, даже если длина строки составляет 4 символа.

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

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