2016-07-21 4 views
3

Я хочу, чтобы иметь возможность открыть файл, добавить текст в конец, а затем прочитать только первую строку. Я точно знаю, сколько времени занимает первая строка файла, и файл достаточно большой, чтобы я не хотел сразу его считывать в память. Я пробовал использовать:Можете ли вы прочитать первую строку из файла с открытым (fname, 'a +')?

with open('./output files/log.txt', 'a+') as f: 

    f.write('This is example text') 

    content = f.readline() 
    print(content) 

, но заявление печати пуста. Когда я пытаюсь использовать open('./output files/log.txt') или open('./output files/log.txt', 'r+') вместо open('./output files/log.txt', 'a+'), это работает, поэтому я знаю, что это связано с аргументом 'a+. Моя проблема в том, что я должен добавить к файлу. Как я могу добавить в файл и при этом получить первую строку без использования что-то вроде

with open('./output files/log.txt', 'a+') as f_1: 

    f.write('This is example text') 

    with open('./output files/log.txt') as f_2: 
     content = f_2.readline() 
     print(content) 
+0

Вы, вероятно, придется 'seek' обратно в начало перед тем, как читать. – melpomene

+0

Вы пишете контент сначала, потому что возможно, что либо файл пуст, либо не существует? Или это так, что файл всегда существует и имеет контент? – Nicarus

+0

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

ответ

3

Когда ты откройте файл с флагом append a, он перемещает указатель файла дескриптора в конец файла, так что вызов write будет добавлен в конец файла.

Функция readline() считывает текущую указатель файла до следующего символа '\n', который он читает. Поэтому, когда вы открываете файл с добавлением, а затем вызываете readline, он попытается прочитать строку, начинающуюся с конца файла. Вот почему ваш звонок print блистает.

Вы можете увидеть это в действии, посмотрев, где находится объект file, используя функцию tell().

Чтобы прочитать первую строку, вам нужно убедиться, что указатель файла находится в начале файла, что вы можете сделать, используя функцию seek. seektakes two arguments: offset и from_what. Если вы опускаете второй аргумент, offset берется с самого начала файла. Итак, чтобы перейти к началу файла, выполните следующие действия: seek(0).

Если вы хотите вернуться в конец файла, вы можете включить опцию from_what. from_what=2 означает смещение с конца файла. Так что прыгать до конца: seek(0, 2).


Демонстрация указателей файлов при открытии в режиме добавления:

Пример использования текстового файла, который выглядит следующим образом:

the first line of the file 
and the last line 

Код:

with open('example.txt', 'a+') as fd: 
    print fd.tell() # at end of file 
    fd.write('example line\n') 
    print fd.tell() # at new end of the file after writing 

    # jump to the beginning of the file: 
    fd.seek(0) 
    print fd.readline() 

    # jump back to the end of the file 
    fd.seek(0, 2) 
    fd.write('went back to the end') 

консольный выход:

45 
57 
the first line of the file 

новое содержимое example.txt:

the first line of the file 
and the last line 
example line 
went back to the end 


Edit: добавлена ​​прыгая назад к концу файла

1

Вы должны вернуться к началу файла с помощью seek(0), например, так:

with open('./output files/log.txt', 'a+') as f_1: 
    f_1.write('This is example text') 
    f_1.seek(0) 
    print(f_1.readline()) 
+0

Означает ли это, что мне нужно снова использовать поиск, чтобы вернуться в конец файла, когда я хочу продолжить добавление текста? Как я могу это сделать, не зная, сколько времени файл? – user144153

+0

[указав параметр 'from_what'] (http://stackoverflow.com/a/11696554/5323213) –