В чем разница между режимами доступа к файлам в Python?

PythonPythonBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Возможности Python по работе с файлами необходимы для широкого спектра приложений. Понимание различных режимов доступа к файлам имеет решающее значение для эффективного управления файлами и манипулирования ими. Эта лабораторная работа углубится в распространенные режимы доступа к файлам в Python, их различия и то, как выбрать подходящий режим для вашего конкретного случая использования.

В этой лабораторной работе вы узнаете об основных режимах доступа к файлам в Python, изучите их распространенные варианты использования и поймете, как выбрать подходящий режим для ваших файловых операций.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/ErrorandExceptionHandlingGroup(["Error and Exception Handling"]) python(("Python")) -.-> python/FileHandlingGroup(["File Handling"]) python/ErrorandExceptionHandlingGroup -.-> python/catching_exceptions("Catching Exceptions") python/FileHandlingGroup -.-> python/file_opening_closing("Opening and Closing Files") python/FileHandlingGroup -.-> python/file_reading_writing("Reading and Writing Files") python/FileHandlingGroup -.-> python/file_operations("File Operations") subgraph Lab Skills python/catching_exceptions -.-> lab-397713{{"В чем разница между режимами доступа к файлам в Python?"}} python/file_opening_closing -.-> lab-397713{{"В чем разница между режимами доступа к файлам в Python?"}} python/file_reading_writing -.-> lab-397713{{"В чем разница между режимами доступа к файлам в Python?"}} python/file_operations -.-> lab-397713{{"В чем разница между режимами доступа к файлам в Python?"}} end

Понимание и практика режима чтения ('r')

В Python режимы доступа к файлам определяют, как файл должен быть открыт и какие операции (например, чтение или запись) разрешены. Понимание этих режимов имеет решающее значение для эффективной работы с файлами. При использовании встроенной функции open() вы указываете путь к файлу и, при необходимости, строку режима. Например, open('my_file.txt', 'r') открывает файл для чтения.

Вот краткий обзор распространенных режимов:

  • Режим чтения ('r'): Открывает для чтения (по умолчанию). Указатель в начале. Вызывает FileNotFoundError, если файл не существует.
  • Режим записи ('w'): Открывает для записи. Усекает (очищает) файл, если он существует, создает его, если нет. Указатель в начале.
  • Режим добавления ('a'): Открывает для записи. Указатель в конце, если файл существует, создает его, если нет. Новые данные добавляются в конец.
  • Чтение и запись ('r+'): Открывает существующий файл для чтения и записи. Указатель в начале.
  • Запись и чтение ('w+'): Открывает для записи и чтения. Усекает или создает файл. Указатель в начале.
  • Добавление и чтение ('a+'): Открывает для добавления и чтения. Указатель в конце для записи. Создает файл, если он не существует.

Давайте попрактикуемся с самым основным режимом: чтение ('r'). Этот режим используется исключительно для чтения содержимого существующего файла. Указатель файла начинается в начале. Помните, что попытка открыть несуществующий файл в режиме 'r' приведет к ошибке.

Сначала нам нужен файл для чтения. Используя редактор VS Code в LabEx, перейдите в каталог /home/labex/project в проводнике файлов. Создайте новый файл с именем my_reading_file.txt. Добавьте в него следующие строки и сохраните файл:

This is the first line.
This is the second line.

Теперь создайте Python-скрипт в том же каталоге с именем read_example.py. Добавьте следующий код, который открывает текстовый файл в режиме чтения, считывает его содержимое и выводит его. Мы включаем блок try...except, чтобы корректно обработать случай, когда файл не может быть найден.

try:
    ## Open the file in read mode ('r')
    with open('/home/labex/project/my_reading_file.txt', 'r') as file:
        ## Read the entire content of the file
        content = file.read()
        print("File content:")
        print(content)
except FileNotFoundError:
    print("Error: The file my_reading_file.txt was not found.")
except Exception as e:
    print(f"An error occurred: {e}")

print("\\nFinished reading the file.")

Сохраните этот Python-скрипт. Затем откройте терминал в VS Code (Terminal > New Terminal). Убедитесь, что вы находитесь в правильном каталоге, запустив pwd, который должен показать /home/labex/project.

Запустите скрипт с помощью интерпретатора Python:

python read_example.py

Вы должны увидеть содержимое my_reading_file.txt, напечатанное в терминале, за которым следует сообщение о завершении:

File content:
This is the first line.
This is the second line.

Finished reading the file.

Это демонстрирует успешное открытие и чтение файла с использованием режима 'r'.

Illustration of reading a file

Практика с режимом записи ('w')

Режим записи ('w') используется, когда вы хотите записать данные в файл. Будьте осторожны: если файл уже существует, открытие его в режиме 'w' усечет его, то есть все его предыдущее содержимое будет удалено. Если файл не существует, режим 'w' создаст его для вас. Этот режим идеально подходит для создания новых файлов или начала работы с существующим файлом с чистого листа.

Давайте попробуем записать данные в файл. В вашем каталоге /home/labex/project создайте новый Python-файл с именем write_example.py. Добавьте следующий код. Этот скрипт откроет (или создаст) my_writing_file.txt в режиме записи и запишет в него две строки.

try:
    ## Open the file in write mode ('w')
    ## If the file exists, its content will be overwritten.
    ## If the file does not exist, it will be created.
    with open('/home/labex/project/my_writing_file.txt', 'w') as file:
        ## Write some content to the file
        file.write("This is the first line written in write mode.\n")
        file.write("This is the second line.\n")
    print("Content successfully written to my_writing_file.txt")

except Exception as e:
    print(f"An error occurred: {e}")

print("\nFinished writing to the file.")

Сохраните скрипт write_example.py. В терминале (все еще в /home/labex/project), запустите скрипт:

python write_example.py

Вы должны увидеть подтверждающее сообщение:

Content successfully written to my_writing_file.txt

Finished writing to the file.

Чтобы убедиться, что файл был создан и содержит правильный текст, используйте команду cat в терминале:

cat /home/labex/project/my_writing_file.txt

Вывод должен быть точно таким, как записал скрипт:

This is the first line written in write mode.
This is the second line.

Это демонстрирует, как создать или перезаписать файл и записать в него содержимое с использованием режима 'w'.

Практика с режимом добавления ('a')

В отличие от режима записи ('w'), режим добавления ('a') используется для добавления содержимого в конец существующего файла, не удаляя его текущее содержимое. Если файл не существует, режим 'a' создаст его. Указатель файла автоматически помещается в конец файла при открытии, поэтому любые операции write() будут добавлять данные.

Давайте добавим несколько строк в my_writing_file.txt, который мы создали на предыдущем шаге. Создайте новый Python-скрипт с именем append_example.py в /home/labex/project со следующим кодом:

try:
    ## Open the file in append mode ('a')
    ## If the file exists, new content will be added to the end.
    ## If the file does not exist, it will be created.
    with open('/home/labex/project/my_writing_file.txt', 'a') as file:
        ## Append some content to the file
        file.write("This line is appended.\n")
        file.write("Another line is appended.\n")
    print("Content successfully appended to my_writing_file.txt")

except Exception as e:
    print(f"An error occurred: {e}")

print("\nFinished appending to the file.")

Сохраните этот скрипт. Теперь выполните его из терминала:

python append_example.py

Скрипт подтвердит операцию добавления:

Content successfully appended to my_writing_file.txt

Finished appending to the file.

Чтобы увидеть результат, используйте cat снова, чтобы просмотреть весь файл:

cat /home/labex/project/my_writing_file.txt

Вы должны увидеть исходные две строки, за которыми следуют две новые добавленные строки:

This is the first line written in write mode.
This is the second line.
This line is appended.
Another line is appended.

Режим добавления очень полезен для таких задач, как добавление записей в журнал или добавление новых записей в файл данных без потери предыдущих данных.

Практика с режимами чтения/записи и выбор правильного режима

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)

Учитывая, нужно ли вам читать, писать, добавлять, обрабатывать существующие файлы или создавать новые, вы можете уверенно выбрать наиболее подходящий режим для вашей задачи.

Итог (Summary)

В этой лабораторной работе вы узнали о различных режимах доступа к файлам в Python и их ключевых различиях. Вы изучили режимы 'r', 'w' и 'a' для основных операций чтения, записи и добавления соответственно. Вы также кратко коснулись режимов чтения и записи ('r+', 'w+', 'a+'), которые предлагают большую гибкость.

Попрактиковавшись с этими режимами и поняв их поведение в отношении создания файлов, усечения и положения указателя, вы теперь готовы выбрать подходящий режим для ваших задач по обработке файлов в Python. Эти знания являются основополагающими для эффективного управления файлами и манипулирования ими в ваших приложениях.