Python
8/7/2026
10 min read

Working with Files in Python (Read, Write & Organize Files)

Working with Files in Python (Read, Write & Organize Files)

Working with files is an important Python skill that you'll use in everything from simple automation scripts to large-scale applications. Whether you're reading configuration files, writing reports, processing datasets, or organizing directories, efficient file handling helps your programs work with real-world data.

Whether you're building your first Python project or improving an existing application, you should learn how to read and write files, understand different file modes, organize files and folders, handle common errors, and apply best practices for safe and maintainable file operations.

These techniques will help you manage files more efficiently and write cleaner, more reliable Python code.

Opening Files with the open() Function

The open() function is the primary way to work with files in Python. Before you can read data from a file, write new content, or update existing information, you need to open the file. Understanding how open() works is essential for file handling in Python, and it forms the foundation of many real-world applications, including automation scripts, data processing pipelines, log analysis, and configuration management.

The basic syntax is straightforward:

file = open("example.txt", "r")

The first argument specifies the file path, while the second argument defines how the file should be opened.

Understanding the open() Function Syntax

The general syntax looks like this:

open(file, mode, encoding=None)

The most commonly used parameters are:

  • File: the name or path of the file

  • Mode: how the file should be accessed

  • Encoding: the character encoding, such as "utf-8"

For text files, specifying the encoding helps avoid character-related issues across different operating systems.

Example:

file = open("notes.txt", "r", encoding="utf-8")

Using UTF-8 is generally recommended because it supports a wide range of characters and is the standard encoding for many modern applications.

Open Files in Different Modes

The mode determines what operations can be performed on the file.

Mode

Description

"r"

This opens a file for reading, raises an error if the file does not exist.

"w"

This opens a file for writing, creates the file if it doesn't exist and overwrites existing content.

"a"

This opens a file for appending, new data is added to the end of the file.

"x"

This creates a new file and raises an error if the file already exists.

"rb"

This opens a file in binary read mode.

"wb"

This opens a file in binary write mode.

Choosing the correct mode prevents accidental data loss and ensures the script behaves as expected.

Read an Existing File

To read a text file:

file = open("example.txt", "r", encoding="utf-8")

content = file.read()

print(content)

file.close()

The read() method returns the entire contents of the file as a string.

For very large files, reading everything at once may consume unnecessary memory. In those cases, processing the file line by line is usually a better approach.

Create or Overwrite a File

Opening a file in write mode creates it automatically if it doesn't already exist.

file = open("report.txt", "w", encoding="utf-8")

file.write("Daily report generated.")

file.close()

If report.txt already contains data, opening it with "w" removes the existing contents before writing the new data.

This behavior makes write mode useful for generating fresh reports or replacing outdated files.

Append Data to an Existing File

When you want to preserve existing content, use append mode.

file = open("log.txt", "a", encoding="utf-8")

file.write("\nBackup completed successfully.")

file.close()

Appending is used for:

  • Application logs

  • Audit records

  • Activity histories

  • Scheduled automation reports

Close Files After Use

When a file is opened, the operating system allocates resources to it. Closing the file releases those resources.

file.close()

Forgetting to close files can lead to problems like:

  • Data not being written completely

  • Locked files

  • Unnecessary resource usage

While manually calling close() works, there is a safer alternative.

Use the with Statement

The recommended way to open files in Python is with the with statement.

with open("example.txt", "r", encoding="utf-8") as file:
    content = file.read()

print(content)

The file is automatically closed when the block finishes executing, even if an exception occurs. The approach makes code cleaner and reduces the risk of resource leaks.

Work with Relative and Absolute Paths

The file path tells Python where to locate the file and a relative path starts from the current project directory.

Example:

with open("data/users.txt", "r") as file:
    print(file.read())

An absolute path specifies the complete location.

Example:

C:\Projects\data\users.txt

Handle Missing Files

Trying to open a file that doesn't exist raises a FileNotFoundError.

Instead of allowing the script to stop unexpectedly, handle the exception gracefully.

try:
    with open("report.txt", "r") as file:
        print(file.read())
except FileNotFoundError:
    print("The file does not exist.")

Common Mistakes When Using open()

Several mistakes occur frequently when working with files:

  • Opening a file with the wrong mode

  • Overwriting important data by using "w" unintentionally

  • Forgetting to specify the correct encoding

  • Leaving files open by not calling close()

  • Assuming a file always exists before opening it

Being aware of these issues helps you write more reliable file handling code.

When to Use the open() Function

The open() function is suitable for many everyday file operations, including:

  • Reading configuration files

  • Writing reports

  • Processing log files

  • Storing application data

  • Importing and exporting text-based information

Although higher-level libraries exist for formats like CSV, JSON, and Excel, they still rely on the same underlying concept of opening files before reading or writing data. Mastering the open() function gives you a solid foundation for working with files throughout the Python ecosystem.

Reading and Writing Files in Python

Reading and writing files in Python allows your programs to work with data that exists beyond a single execution. Instead of relying only on user input or hardcoded values, you can load information from existing files, process it, and save the results for future use. This is essential for applications such as data processing, automation, logging, report generation, and configuration management.

Python provides built-in tools that make file operations simple while remaining flexible enough for more advanced use cases.

Reading the Entire Contents of a File

If you're working with a relatively small text file, you can read everything at once using the read() method.

with open("notes.txt", "r", encoding="utf-8") as file:
    content = file.read()

print(content)

The read() method returns the complete contents of the file as a single string.

Reading Files Line by Line

Many Python applications process files one line at a time. This reduces memory usage and allows your script to start processing immediately.

with open("server.log", "r", encoding="utf-8") as file:
    for line in file:
        print(line.strip())

Reading a Specific Number of Characters

Sometimes you only need part of a file. The read() method accepts an optional argument that specifies how many characters to retrieve.

with open("example.txt", "r", encoding="utf-8") as file:
    content = file.read(100)

print(content)

Writing Data to a File

Writing data allows your script to create reports, save processed information, or generate output files.

Example:

with open("report.txt", "w", encoding="utf-8") as file:
    file.write("Report generated successfully.")

Writing Multiple Lines

The writelines() method allows you to write a collection of strings.

Example:

lines = [
    "Alice\n",
    "Bob\n",
    "Charlie\n"
]

with open("users.txt", "w", encoding="utf-8") as file:
    file.writelines(lines)

Note that writelines() does not automatically insert newline characters. Be sure to include \n where needed.

Choosing the Correct File Mode

Selecting the appropriate file mode is very important.

Mode

Typical Use Case

"r"

Read existing files

"w"

Create or overwrite files

"a"

Add new content to existing files

"r+"

Read and write without creating a new file

"x"

Create a file only if it does not already exist

Using the wrong mode can lead to overwritten files or unexpected errors.

Understanding File Modes (r, w, a, and x)

When working with files in Python, the file mode determines what your program is allowed to do after opening a file. Choosing the correct mode is essential because it affects whether you can read data, create new files, modify existing content, or accidentally overwrite important information.

The mode is passed as the second argument to the open() function.

with open("example.txt", "r") as file:
    content = file.read()

Understanding the differences between r, w, a, and x helps you avoid common file handling mistakes and write safer Python applications.

Read Mode (r)

The r mode opens a file for reading only. This is the default mode used by open().

with open("notes.txt", "r", encoding="utf-8") as file:
    content = file.read()

Use read mode when your script only needs to access existing data without making changes.

Typical use cases include:

  • Reading configuration files

  • Loading application settings

  • Processing log files

  • Analyzing datasets

  • Displaying stored information

If the file does not exist, Python raises a FileNotFoundError.

try:
    with open("missing.txt", "r") as file:
        print(file.read())
except FileNotFoundError:
    print("File not found.")

Write Mode (w)

The w mode opens a file for writing.

with open("report.txt", "w", encoding="utf-8") as file:
    file.write("Monthly report")

If the file already exists, all previous contents are erased before the new data is written.

Append Mode (a)

The a mode opens a file for appending. Instead of replacing existing data, new content is added to the end of the file.

with open("activity.log", "a", encoding="utf-8") as file:
    file.write("Backup completed.\n")

If the file does not exist, Python creates it automatically.

Exclusive Create Mode (x)

The x mode creates a brand-new file.

with open("config.txt", "x", encoding="utf-8") as file:
    file.write("Configuration created.")

Unlike write mode, x refuses to overwrite an existing file.

Choosing the Right Mode for a Task

Each file mode serves a different purpose.

  • Use r when you only need to read existing information.

  • Choose w when creating a fresh output file or replacing outdated content.

  • Select a when preserving existing data while adding new records.

  • Use x when the file must be created only once and overwriting is not acceptable.

Matching the file mode to a specific task makes your code safer and easier to understand.

Combining File Modes with the with Statement

Regardless of the file mode you choose, using the with statement is considered best practice.

with open("data.txt", "r", encoding="utf-8") as file:
    content = file.read()

The file is closed automatically after the block finishes, even if an exception occurs. This approach improves reliability and eliminates the need to call close() manually.

Closing Files Safely with the with Statement

One of the best practices in Python file handling is opening files with the with statement. While you can open a file and close it manually, the with statement ensures the file is closed automatically after the block of code finishes executing which makes your code cleaner, safer, and less likely to leave files open accidentally.

For most situations involving reading and writing files in Python, the with statement should be your default choice.

When working with files in Python, adopting a few simple habits like this improves reliability:

  • Using the with statement for every file operation

  • Specifying the file encoding for text files

  • Keeping file operations inside the with block

  • Combining with with exception handling when opening external files

Following these practices helps prevent resource leaks, reduces the chance of file-related bugs, and makes your file handling code easier to maintain as your projects grow.

Tags

Enjoyed this article?

Subscribe to our newsletter for more backend engineering insights and tutorials.