Как возобновить операцию чтения файла с помощью Python

У меня есть файл размером 15-16 ГБ, содержащий объекты json, разделенные новой строкой (\ n).

Я новичок в Python и чтение файла, используя следующий код.

with open(filename,'rb') as file:
  for data in file:  
    dosomething(data)

Если во время чтения чтения мой сценарий завершается ошибкой после 5 ГБ, как я могу возобновить операцию чтения с последней позиции чтения и продолжить с нее?

Я пытаюсь сделать то же самое, используя file.tell(), чтобы получить позицию и переместить указатель с помощью функции seek().

Так как этот файл содержит объекты json, после операции поиска я получаю ошибку belwo.

ValueError: ни один объект JSON не может быть декодирован

Я предполагаю, что после операции поиска указатель не получает правильный JSON.

Как я могу решить это? Есть ли другой способ чтения из последней позиции чтения в Python.

2 ответа

Используйте другой файл для хранения текущего местоположения:

cur_loc = open("location.txt", "w+")
cur_loc.write('0')
exception = False

i = 0

with open("test.txt","r") as f:
    while(True):
        i+=1
        if exception:
            cur_loc.seek(0)
            pos = int(cur_loc.readline())
            f.seek(pos)
            exception = False

        try:
            read = f.readline()
            print read,
            if i==5:
                print "Exception Happened while reading file!"
                x = 1/0 #to make an exception
            #remove above if block and do everything you want here.
            if read == '':
                break
        except:
            exception = True
            cur_loc.seek(0)
            cur_loc.write(str(f.tell()))

cur_loc.close()

Предположим, у нас есть следующий text.txt в качестве входного файла:

#contents of text.txt
1
2
3
4
5
6
7
8
9
10

Когда вы запустите программу выше, у вас будет:

>>> ================================ RESTART ================================
>>> 
1
2
3
4
5
Exception Happened while reading file!
6
7
8
9
10 
>>> 

Вы можете использовать для i, строку в enumerate(open_file), чтобы получить номера строк и сохранить эту переменную. когда ваш скрипт не работает, вы можете отобразить эту переменную для пользователя. Затем вам нужно будет сделать необязательный аргумент командной строки для этой переменной. если переменная задана, ваш скрипт должен сделать открытое_файл.readline() для i в диапазоне (переменная). Таким образом, вы попадете в точку, где вы оставили.

for i in range(passed_variable):
    opened_file.readline()
Другие вопросы по тегам