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

Я пытаюсь добавить строку в файл, если строка не выходит из файла. Однако открытие файла с параметром a+ не позволяет мне делать сразу, потому что открытие файла с помощью a+ поместит указатель в конец файла, что означает, что мой поиск всегда терпит неудачу. Есть ли какой-нибудь хороший способ сделать это, кроме открытия файла, чтобы читать сначала, закрывать и открывать снова, чтобы добавить?

В коде, видимо, ниже не работает.

file = open("fileName", "a+")

Мне нужно сделать следующее для его достижения.

file = open("fileName", "r")
... check if a string exist in the file
file.close()

... if the string doesn't exist in the file
file = open("fileName", "a")
file.write("a string")
file.close()

Ответ 1

Чтобы оставить входной файл без изменений, если needle находится в любой строке или добавить иглу в конце файла, если она отсутствует:

with open("filename", "r+") as file:
    for line in file:
        if needle in line:
           break
    else: # not found, we are at the eof
        file.write(needle) # append missing data

Я тестировал его и работает как на Python 2 (на основе ввода-вывода на основе stdio), так и на Python 3 (POSIX-чтение/запись на основе ввода-вывода).

В коде используется скрытый else после синтаксиса Python цикла. См. Почему python использует "else" после циклов while и while?

Ответ 2

Вы можете установить текущую позицию файлового объекта с помощью file.seek(). Чтобы перейти к началу файла, используйте

f.seek(0, os.SEEK_SET)

Чтобы перейти к концу файла, используйте

f.seek(0, os.SEEK_END)

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

import os

with open("file.txt", "r+") as f:
    line_found = any("foo" in line for line in f)
    if not line_found:
        f.seek(0, os.SEEK_END)
        f.write("yay, a new line!\n")