How to Read a File in Python

What you’ll build or solve

You’ll read text files in Python using the safest, most common patterns.

When this approach works best

Reading a file works well when you:

  • Load data from a text file, like a list of names, config values, or log output.
  • Process large files without loading everything into memory at once.
  • Clean or search text, like finding errors in a log or filtering lines that match a keyword.

Avoid this approach when your data is structured like JSON or CSV and you need reliable parsing. In those cases, use json or csv so you don’t reinvent parsing rules.

Prerequisites

  • Python installed
  • You know what a file and folder are on your computer

Step-by-step instructions

1) Open the file with a context manager

Use with open(...) so Python closes the file automatically.

with open("notes.txt", "r") as f:
    text = f.read()

print(text)

2) Choose how you want to read the contents

Pick the reading method based on the file size and what you need.

Option A (most common): Read the whole file with read()

Best for small files.

with open("notes.txt", "r") as f:
    text = f.read()

print(text)

Option B: Read line by line in a loop

Best for large files or streaming-style processing.

with open("notes.txt", "r") as f:
    for line in f:
        print(line.strip())

Option C: Read all lines into a list with readlines()

Useful when you want random access to lines, but it loads everything into memory.

with open("notes.txt", "r") as f:
    lines = f.readlines()

print(lines[0])

3) Specify encoding explicitly

Always set encoding when opening text files to avoid decode errors.

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

print(text)

What to look for: utf-8 works for most modern files. If you see UnicodeDecodeError, try a Windows-friendly encoding in Troubleshooting. For portable paths, see Example 4.


4) Handle missing files cleanly

If a file might not exist, catch the error and show a helpful message.

try:
    with open("notes.txt", "r", encoding="utf-8") as f:
        text = f.read()
    print(text)
except FileNotFoundError:
    print("Could not find notes.txt. Check the file name and folder.")

Examples you can copy

Example 1: Read a whole file and count characters

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

print(len(text))

Example 2: Read line by line and keep only non-empty lines

clean_lines = []

with open("notes.txt", "r", encoding="utf-8") as f:
    for line in f:
        line = line.strip()
        if line:
            clean_lines.append(line)

print(clean_lines)

Example 3: Search a log file for lines that contain a word

matches = []

with open("app.log", "r", encoding="utf-8") as f:
    for line in f:
        if "ERROR" in line:
            matches.append(line.rstrip())

print(matches[:5])

Example 4: Read a file next to your script with pathlib

This example uses pathlib to build a path that works even when you run the script from a different folder.

from pathlib import Path

file_path = Path(__file__).with_name("data.txt")

with file_path.open("r", encoding="utf-8") as f:
    text = f.read()

print(text)

Common mistakes and how to fix them

Mistake 1: Forgetting the context manager

What you might do:

f = open("notes.txt", "r")
text = f.read()
print(text)

Why it breaks: The file can stay open longer than you expect, which can cause locked files or bugs in longer scripts.

Correct approach:

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

print(text)

Mistake 2: Using the wrong working directory

What you might do:

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

…and then get FileNotFoundError.

Why it breaks: Python looks in the folder you run the script from, which might not be the folder where the file lives.

Correct approach:

from pathlib import Path

file_path = Path(__file__).with_name("notes.txt")

with file_path.open("r", encoding="utf-8") as f:
    print(f.read())

Mistake 3: Not setting an encoding

What you might do:

with open("notes.txt", "r") as f:
    print(f.read())

Why it breaks: Python uses a default encoding that may not match the file, causing UnicodeDecodeError or garbled text.

Correct approach:

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

Troubleshooting

If you see FileNotFoundError, check the folder you run the script from. Print it with:

import os
print(os.getcwd())

If you see UnicodeDecodeError, try a different encoding. On Windows, cp1252 is a common fallback:

with open("notes.txt", "r", encoding="cp1252") as f:
    print(f.read())

If your output has blank lines, you may be printing lines that already end with \n. Use print(line.strip()) or print(line, end="").

If you get PermissionError, close the file in other apps or read from a location you have access to.

If your script works in one IDE but not in the terminal, your working directory differs. Use pathlib to anchor paths to your script.


Quick recap

  • Open files with with open(...) so they close automatically.
  • Use read() for small files, or loop over the file for large files.
  • Set encoding="utf-8" for text files.
  • Catch FileNotFoundError when the file may be missing.
  • Use pathlib when you need paths that work across folders.