Практика с режимами чтения/записи и выбор правильного режима
Python также предоставляет режимы, которые позволяют как читать, так и записывать данные в одном и том же контексте open()
. Они предлагают большую гибкость, но требуют осторожного обращения с указателем файла.
- Чтение и запись (
'r+'
): Открывает существующий файл как для чтения, так и для записи. Указатель начинается в начале. Запись перезапишет существующее содержимое с позиции указателя.
- Запись и чтение (
'w+'
): Открывает файл для записи и чтения. Он усекает файл, если он существует, или создает его, если нет. Указатель начинается в начале.
- Добавление и чтение (
'a+'
): Открывает файл для добавления (записи в конце) и чтения. Он создает файл, если он не существует. Указатель начинается в конце для записи, но вы можете переместить его (например, с помощью file.seek(0)
), чтобы читать с начала.
Давайте продемонстрируем 'r+'
. Мы будем использовать my_reading_file.txt
, созданный на шаге 1. Мы откроем его, прочитаем содержимое, затем переместим указатель обратно в начало и перезапишем начало файла.
Создайте Python-файл с именем rplus_example.py
в /home/labex/project
. Добавьте этот код:
try:
## Open the file in read and write mode ('r+')
## The file must exist for this mode.
with open('/home/labex/project/my_reading_file.txt', 'r+') as file:
## Read the initial content
initial_content = file.read()
print("Initial file content:")
print(initial_content)
## Move the file pointer back to the beginning
print("\nMoving pointer to the beginning using file.seek(0).")
file.seek(0)
## Write new content at the beginning (overwriting existing content)
print("Writing new content...")
file.write("Prepended line 1.\n")
file.write("Prepended line 2.\n")
## If the new content is shorter than what was overwritten,
## the rest of the original content might remain unless truncated.
## We can use file.truncate() after writing to remove any trailing old data.
print("Truncating file to the current position to remove old trailing data.")
file.truncate()
print("\nContent written and file truncated.")
except FileNotFoundError:
print("Error: The file was not found. 'r+' requires the file to exist.")
except Exception as e:
print(f"An error occurred: {e}")
print("\nFinished with r+ mode example.")
Этот скрипт открывает файл в режиме 'r+'
, читает, возвращается в начало (file.seek(0)
), записывает новые строки (перезаписывая), а затем использует file.truncate()
, чтобы удалить любые оставшиеся исходные данные, которые могут существовать за пределами вновь написанного текста.
Сохраните rplus_example.py
. Прежде чем запускать его, давайте убедимся, что my_reading_file.txt
имеет свое исходное содержимое:
echo "This is the first line." > /home/labex/project/my_reading_file.txt
echo "This is the second line." >> /home/labex/project/my_reading_file.txt
Теперь запустите Python-скрипт из терминала:
python rplus_example.py
Вы увидите напечатанное исходное содержимое, за которым следуют сообщения о процессе:
Initial file content:
This is the first line.
This is the second line.
Moving pointer to the beginning using file.seek(0).
Writing new content...
Truncating file to the current position to remove old trailing data.
Content written and file truncated.
Finished with r+ mode example.
Проверьте конечное содержимое файла с помощью cat
:
cat /home/labex/project/my_reading_file.txt
Вывод должен показывать только что записанное содержимое благодаря перезаписи и усечению:
Prepended line 1.
Prepended line 2.
Выбор подходящего режима доступа к файлу
Выбор правильного режима жизненно важен. Вот краткое руководство:
- Используйте
'r'
для доступа только для чтения к существующим файлам.
- Используйте
'w'
для создания нового файла или полной замены содержимого существующего файла.
- Используйте
'a'
для добавления в конец файла без потери существующих данных (хорошо подходит для журналов).
- Используйте
'r+'
для чтения и изменения существующего файла с самого начала.
- Используйте
'w+'
для создания или перезаписи файла, а затем чтения/записи его.
- Используйте
'a+'
для добавления в файл, а также для возможности его чтения (требуется перемещение указателя с помощью seek
).
Эта таблица суммирует ключевые особенности поведения:
Режим (Mode) |
Чтение (Read) |
Запись (Write) |
Создать, если не существует (Create if not exists) |
Усечь, если существует (Truncate if exists) |
Позиция указателя (изначальная) (Pointer Position (Initial)) |
'r' |
Да (Yes) |
Нет (No) |
Нет (No) |
Нет (No) |
Начало (Beginning) |
'w' |
Нет (No) |
Да (Yes) |
Да (Yes) |
Да (Yes) |
Начало (Beginning) |
'a' |
Нет (No) |
Да (Yes) |
Да (Yes) |
Нет (No) |
Конец (End) |
'r+' |
Да (Yes) |
Да (Yes) |
Нет (No) |
Нет (No) |
Начало (Beginning) |
'w+' |
Да (Yes) |
Да (Yes) |
Да (Yes) |
Да (Yes) |
Начало (Beginning) |
'a+' |
Да (Yes) |
Да (Yes) |
Да (Yes) |
Нет (No) |
Конец (End) |
Учитывая, нужно ли вам читать, писать, добавлять, обрабатывать существующие файлы или создавать новые, вы можете уверенно выбрать наиболее подходящий режим для вашей задачи.