'r'
прочитает файл, 'w'
запишет текст в файл с самого начала, а 'a'
добавит. Как я могу открыть файл для чтения и добавления одновременно?
Я пробовал это, но получил ошибки:
open("filename", "r,a")
open("filename", "w")
open("filename", "r")
open("filename", "a")
ошибка:
invalid mode: 'r,a'
Вы не можете сделать это с текстовым файлом. Либо вы хотите прочитать это, либо вы хотите написать к нему. a
или r
указывает seek
на определенное место в файле. Указание обоих означает, что open
указывает на два разных места в файле одновременно.
Текстовые файлы вообще нельзя обновлять на месте. Вы можете использовать a
, чтобы добавить новый материал в конец, но это все. Чтобы сделать то, что, я думаю, вы хотите, вам нужно открыть существующий файл в режиме чтения и открыть другой, новый файл в режиме записи, и скопировать данные из одного в другой.
После этого у вас есть два файла, поэтому вам нужно позаботиться об удалении старого. Если это проблематично, взгляните на модуль in-place
.
Другой альтернативой является чтение входного файла в память, закрытие и повторное открытие его для записи, а затем запись новой версии файла. Тогда вам не придется удалять старую копию. Но если что-то пойдет не так в середине, у вас не будет ни старого входного файла, потому что вы его удалили, ни нового выходного файла, потому что вы его не записали.
Причина этого в том, что текстовые файлы не предназначены для произвольного доступа.
Вы ищете режим r+
или a+
, который позволяет выполнять операции чтения и записи в файлы (узнать больше).
С r+
позиция изначально находится в начале, но однократное чтение сдвинет ее к концу, что позволит вам добавить. С a+
позиция изначально находится в конце.
with open("filename", "r+") as f:
# here, position is initially at the beginning
text = f.read()
# after reading, the position is pushed toward the end
f.write("stuff to append")
with open("filename", "a+") as f:
# here, position is already at the end
f.write("stuff to append")
Если вам когда-нибудь понадобится полностью перечитать, вы можете вернуться в исходное положение, выполнив f.seek(0)
.
with open("filename", "r+") as f:
text = f.read()
f.write("stuff to append")
f.seek(0) # return to the top of the file
text = f.read()
assert text.endswith("stuff to append")
можешь попробовать
open("filename", "a+")