Pythonのファイルへの書き込み–開く、読み取る、追加する、およびその他のファイル処理関数の説明

ようこそ

こんにちは!Pythonでファイルを操作する方法を学びたい場合は、この記事が役に立ちます。ファイルの操作は、すべてのPython開発者が学ぶべき重要なスキルなので、始めましょう。

この記事では、次のことを学びます。

  • ファイルを開く方法。
  • ファイルの読み方。
  • ファイルの作成方法。
  • ファイルを変更する方法。
  • ファイルを閉じる方法。
  • 複数の操作のためにファイルを開く方法。
  • ファイルオブジェクトメソッドの操作方法。
  • ファイルを削除する方法。
  • コンテキストマネージャーを操作する方法と、それらが役立つ理由。
  • ファイルを操作するときに発生する可能性のある例外を処理する方法。
  • もっと!

さぁ、始めよう!✨

🔹ファイルの操作:基本的な構文

Pythonでファイルを操作するときに使用する必要がある最も重要な関数の1つは、ファイルを開き、プログラムがファイルを使用して操作できるようopen()する組み込み関数です。

これが基本的な構文です:

💡ヒント:これらは、この関数を呼び出すために最も一般的に使用される2つの引数です。6つの追加のオプションの引数があります。それらの詳細については、ドキュメントのこの記事をお読みください。

最初のパラメータ:ファイル

open()関数の最初のパラメーターは、操作fileしようとしているファイルへの絶対パスまたは相対パスです。

通常、相対パスを使用します。これは、open()関数を呼び出しているスクリプト(Pythonファイル)の場所を基準にしてファイルが配置されている場所を示します。

たとえば、この関数呼び出しのパスは次のとおりです。

open("names.txt") # The relative path is "names.txt"

ファイルの名前のみが含まれます。これは、開こうとしているファイルが次のようにPythonスクリプトと同じディレクトリまたはフォルダにある場合に使用できます。

ただし、ファイルがネストされたフォルダー内にある場合は、次のようになります。

次に、特定のパスを使用して、ファイルが別のフォルダー内にあることを関数に通知する必要があります。

この例では、これがパスになります。

open("data/names.txt")

data/最初に(フォルダの名前の後に。が続く/)、次にnames.txt(拡張子が付いたファイルの名前)を書き込んでいることに注意してください。

💡ヒント:.txtドットに続く3文字names.txtは、ファイルの「拡張子」またはそのタイプです。この場合、.txtはテキストファイルであることを示します。

2番目のパラメーター:モード

open()関数の2番目のパラメーターは、mode1文字の文字列です。その1文字は基本的に、プログラム内のファイルで何をする予定かをPythonに伝えます。

使用可能なモードは次のとおりです。

  • "r")を読んでください。
  • 追加("a"
  • 書く("w"
  • 作成("x"

次の場所でファイルを開くこともできます。

  • テキストモード("t"
  • バイナリモード("b"

テキストモードまたはバイナリモードを使用するには、これらの文字をメインモードに追加する必要があります。例:"wb"バイナリモードでの書き込みを意味します。

💡 Tip: The default modes are read ("r") and text ("t"), which means "open for reading text" ("rt"), so you don't need to specify them in open() if you want to use them because they are assigned by default. You can simply write open().

Why Modes?

It really makes sense for Python to grant only certain permissions based what you are planning to do with the file, right? Why should Python allow your program to do more than necessary? This is basically why modes exist.

Think about it — allowing a program to do more than necessary can problematic. For example, if you only need to read the content of a file, it can be dangerous to allow your program to modify it unexpectedly, which could potentially introduce bugs.

🔸 How to Read a File

open()関数が取る引数について詳しく知ったところで、ファイルを開いて変数に格納し、プログラムで使用する方法を見てみましょう。

これが基本的な構文です。

返された値を変数に割り当てるだけです。例えば:

names_file = open("data/names.txt", "r")

私はあなたが尋ねているかもしれないことを知っています:どのタイプの値がによって返されopen()ますか?

まあ、ファイルオブジェクト

それらについて少し話しましょう。

ファイルオブジェクト

Pythonのドキュメントによると、ファイルオブジェクトは次のとおりです。

ファイル指向のAPI(read()やwrite()などのメソッドを使用)を基になるリソースに公開するオブジェクト。

これは基本的に、ファイルオブジェクトがPythonプログラム内の既存のファイルを操作および操作できるようにするオブジェクトであることを示しています。

ファイルオブジェクトには、次のような属性があります。

  • name: the name of the file.
  • closed: True if the file is closed. False otherwise.
  • mode: the mode used to open the file.

For example:

f = open("data/names.txt", "a") print(f.mode) # Output: "a"

Now let's see how you can access the content of a file through a file object.

Methods to Read a File

For us to be able to work file objects, we need to have a way to "interact" with them in our program and that is exactly what methods do. Let's see some of them.

Read()

The first method that you need to learn about is read(),which returns the entire content of the file as a string.

Here we have an example:

f = open("data/names.txt") print(f.read())

The output is:

Nora Gino Timmy William

You can use the type() function to confirm that the value returned by f.read() is a string:

print(type(f.read())) # Output 

Yes, it's a string!

In this case, the entire file was printed because we did not specify a maximum number of bytes, but we can do this as well.

Here we have an example:

f = open("data/names.txt") print(f.read(3))

The value returned is limited to this number of bytes:

Nor

❗️Important: You need to close a file after the task has been completed to free the resources associated to the file. To do this, you need to call the close() method, like this:

Readline() vs. Readlines()

You can read a file line by line with these two methods. They are slightly different, so let's see them in detail.

readline() reads one line of the file until it reaches the end of that line. A trailing newline character (\n) is kept in the string.

💡 Tip: Optionally, you can pass the size, the maximum number of characters that you want to include in the resulting string.

For example:

f = open("data/names.txt") print(f.readline()) f.close()

The output is:

Nora 

This is the first line of the file.

In contrast, readlines() returns a list with all the lines of the file as individual elements (strings). This is the syntax:

For example:

f = open("data/names.txt") print(f.readlines()) f.close()

The output is:

['Nora\n', 'Gino\n', 'Timmy\n', 'William']

Notice that there is a \n (newline character) at the end of each string, except the last one.

💡 Tip: You can get the same list with list(f).

You can work with this list in your program by assigning it to a variable or using it in a loop:

f = open("data/names.txt") for line in f.readlines(): # Do something with each line f.close()

We can also iterate over f directly (the file object) in a loop:

f = open("data/names.txt", "r") for line in f: # Do something with each line f.close()

Those are the main methods used to read file objects. Now let's see how you can create files.

🔹ファイルを作成する方法

Pythonを使用して「動的に」ファイルを作成する必要がある場合は、"x"モードを使用して作成できます。

方法を見てみましょう。これが基本的な構文です。

これが例です。これは私の現在の作業ディレクトリです:

このコード行を実行すると、次のようになります。

f = open("new_file.txt", "x")

その名前の新しいファイルが作成されます。

このモードでは、ファイルを作成してから、すぐに学習する方法を使用して動的にファイルに書き込むことができます。

💡ヒント:ファイルは、変更するまで最初は空になります。

不思議なことに、この行を再度実行しようとして、その名前のファイルが既に存在する場合、次のエラーが表示されます。

Traceback (most recent call last): File "", line 8, in  f = open("new_file.txt", "x") FileExistsError: [Errno 17] File exists: 'new_file.txt'

Pythonのドキュメントによると、この例外(実行時エラー)は次のとおりです。

すでに存在するファイルまたはディレクトリを作成しようとしたときに発生します。

Now that you know how to create a file, let's see how you can modify it.

🔸 How to Modify a File

To modify (write to) a file, you need to use the write() method. You have two ways to do it (append or write) based on the mode that you choose to open it with. Let's see them in detail.

Append

"Appending" means adding something to the end of another thing. The "a" mode allows you to open a file to append some content to it.

For example, if we have this file:

And we want to add a new line to it, we can open it using the "a" mode (append) and then, call the write() method, passing the content that we want to append as argument.

This is the basic syntax to call the write()method:

Here's an example:

f = open("data/names.txt", "a") f.write("\nNew Line") f.close()

💡 Tip: Notice that I'm adding \n before the line to indicate that I want the new line to appear as a separate line, not as a continuation of the existing line.

This is the file now, after running the script:

💡 Tip: The new line might not be displayed in the file untilf.close() runs.

Write

Sometimes, you may want to delete the content of a file and replace it entirely with new content. You can do this with the write() method if you open the file with the "w" mode.

Here we have this text file:

If I run this script:

f = open("data/names.txt", "w") f.write("New Content") f.close() 

This is the result:

As you can see, opening a file with the "w" mode and then writing to it replaces the existing content.

💡 Tip: The write() method returns the number of characters written.

If you want to write several lines at once, you can use the writelines() method, which takes a list of strings. Each string represents a line to be added to the file.

Here's an example. This is the initial file:

If we run this script:

f = open("data/names.txt", "a") f.writelines(["\nline1", "\nline2", "\nline3"]) f.close()

The lines are added to the end of the file:

Open File For Multiple Operations

Now you know how to create, read, and write to a file, but what if you want to do more than one thing in the same program? Let's see what happens if we try to do this with the modes that you have learned so far:

If you open a file in "r" mode (read), and then try to write to it:

f = open("data/names.txt") f.write("New Content") # Trying to write f.close()

You will get this error:

Traceback (most recent call last): File "", line 9, in  f.write("New Content") io.UnsupportedOperation: not writable

Similarly, if you open a file in "w" mode (write), and then try to read it:

f = open("data/names.txt", "w") print(f.readlines()) # Trying to read f.write("New Content") f.close()

You will see this error:

Traceback (most recent call last): File "", line 14, in  print(f.readlines()) io.UnsupportedOperation: not readable

The same will occur with the "a" (append) mode.

How can we solve this? To be able to read a file and perform another operation in the same program, you need to add the "+" symbol to the mode, like this:

f = open("data/names.txt", "w+") # Read + Write
f = open("data/names.txt", "a+") # Read + Append
f = open("data/names.txt", "r+") # Read + Write

Very useful, right? This is probably what you will use in your programs, but be sure to include only the modes that you need to avoid potential bugs.

Sometimes files are no longer needed. Let's see how you can delete files using Python.

🔹 How to Delete Files

To remove a file using Python, you need to import a module called os which contains functions that interact with your operating system.

💡 Tip: A module is a Python file with related variables, functions, and classes.

Particularly, you need the remove()function. This function takes the path to the file as argument and deletes the file automatically.

Let's see an example. We want to remove the file called sample_file.txt.

To do it, we write this code:

import os os.remove("sample_file.txt")
  • The first line: import os is called an "import statement". This statement is written at the top of your file and it gives you access to the functions defined in the os module.
  • The second line: os.remove("sample_file.txt") removes the file specified.

💡 Tip: you can use an absolute or a relative path.

Now that you know how to delete files, let's see an interesting tool... Context Managers!

🔸 Meet Context Managers

Context Managers are Python constructs that will make your life much easier. By using them, you don't need to remember to close a file at the end of your program and you have access to the file in the particular part of the program that you choose.

Syntax

This is an example of a context manager used to work with files:

💡 Tip: The body of the context manager has to be indented, just like we indent loops, functions, and classes. If the code is not indented, it will not be considered part of the context manager.

When the body of the context manager has been completed, the file closes automatically.

with open("", "") as : # Working with the file... # The file is closed here!

Example

Here's an example:

with open("data/names.txt", "r+") as f: print(f.readlines()) 

This context manager opens the names.txt file for read/write operations and assigns that file object to the variable f. This variable is used in the body of the context manager to refer to the file object.

Trying to Read it Again

After the body has been completed, the file is automatically closed, so it can't be read without opening it again. But wait! We have a line that tries to read it again, right here below:

with open("data/names.txt", "r+") as f: print(f.readlines()) print(f.readlines()) # Trying to read the file again, outside of the context manager

しばらく様子を見てみましょう:

Traceback (most recent call last): File "", line 21, in  print(f.readlines()) ValueError: I/O operation on closed file.

このエラーは、閉じたファイルを読み取ろうとしているためにスローされます。すごいですよね?コンテキストマネージャーは私たちのためにすべての重い仕事をします、それは読みやすく、そして簡潔です。

🔹ファイルを操作するときに例外を処理する方法

ファイルを操作しているときに、エラーが発生する可能性があります。ファイルを変更またはアクセスするために必要な権限がない場合や、ファイルが存在しない場合もあります。

プログラマーは、ユーザーエクスペリエンスに確実に影響を与える可能性のある突然のクラッシュを回避するために、これらの状況を予測し、プログラムで処理する必要があります。

ファイルを操作するときに見つかる可能性のある最も一般的な例外(実行時エラー)のいくつかを見てみましょう。

FileNotFoundError

Pythonのドキュメントによると、この例外は次のとおりです。

ファイルまたはディレクトリが要求されたが存在しない場合に発生します。

For example, if the file that you're trying to open doesn't exist in your current working directory:

f = open("names.txt")

You will see this error:

Traceback (most recent call last): File "", line 8, in  f = open("names.txt") FileNotFoundError: [Errno 2] No such file or directory: 'names.txt'

Let's break this error down this line by line:

  • File "", line 8, in . This line tells you that the error was raised when the code on the file located in was running. Specifically, when line 8 was executed in .
  • f = open("names.txt"). This is the line that caused the error.
  • FileNotFoundError: [Errno 2] No such file or directory: 'names.txt' . This line says that a FileNotFoundError exception was raised because the file or directory names.txt doesn't exist.

💡 Tip: Python is very descriptive with the error messages, right? This is a huge advantage during the process of debugging.

PermissionError

This is another common exception when working with files. According to the Python Documentation, this exception is:

適切なアクセス権(ファイルシステムのアクセス許可など)なしで操作を実行しようとしたときに発生します。

この例外は、アクセスする権限がないファイルを読み取ったり変更したりしようとしたときに発生します。これを行おうとすると、次のエラーが表示されます。

Traceback (most recent call last): File "", line 8, in  f = open("") PermissionError: [Errno 13] Permission denied: 'data'

IsADirectoryError

Pythonのドキュメントによると、この例外は次のとおりです。

ディレクトリでファイル操作が要求されたときに発生します。

この特定の例外は、ファイルではなくディレクトリを開いたり操作したりしようとすると発生するため、引数として渡すパスには十分注意してください。

例外の処理方法

これらの例外を処理するには、try / exceptステートメントを使用できます。このステートメントを使用すると、予期しないことが発生した場合の対処方法をプログラムに「指示」できます。

これが基本的な構文です。

try: # Try to run this code except : # If an exception of this type is raised, stop the process and jump to this block 

Here you can see an example with FileNotFoundError:

try: f = open("names.txt") except FileNotFoundError: print("The file doesn't exist")

This basically says:

  • Try to open the file names.txt.
  • If a FileNotFoundError is thrown, don't crash! Simply print a descriptive statement for the user.

💡 Tip: You can choose how to handle the situation by writing the appropriate code in the except block. Perhaps you could create a new file if it doesn't exist already.

To close the file automatically after the task (regardless of whether an exception was raised or not in the try block) you can add the finally block.

try: # Try to run this code except : # If this exception is raised, stop the process immediately and jump to this block finally: # Do this after running the code, even if an exception was raised

This is an example:

try: f = open("names.txt") except FileNotFoundError: print("The file doesn't exist") finally: f.close()

There are many ways to customize the try/except/finally statement and you can even add an else block to run a block of code only if no exceptions were raised in the try block.

💡 Tip: To learn more about exception handling in Python, you may like to read my article: "How to Handle Exceptions in Python: A Detailed Visual Introduction".

🔸 In Summary

  • You can create, read, write, and delete files using Python.
  • File objects have their own set of methods that you can use to work with them in your program.
  • Context Managers help you work with files and manage them by closing them automatically when a task has been completed.
  • Exception handling is key in Python. Common exceptions when you are working with files include FileNotFoundError, PermissionError and IsADirectoryError. They can be handled using try/except/else/finally.

I really hope you liked my article and found it helpful. Now you can work with files in your Python projects. Check out my online courses. Follow me on Twitter. ⭐️