How to Solve Python AttributeError: ‘str’ object has no attribute ‘readline’

by | Programming, Python, Tips

Introduction

In Python, the error AttributeError: 'str' object has no attribute 'readline' often arises when you mistakenly try to use the readline() method on a string object rather than a file object. This error is common in scenarios where you’re working with file paths or content from files.

Example

Say we have a file called example.txt that has the following contents:

This is the first line of the file.
Here’s the second line.
This is the third line.
The fourth line goes here.
Finally, the fifth line.

Suppose you’re trying to read the contents of a file line by line, but you mistakenly attempt to call the readline() method on a string (the file path) instead of on the actual file object:

def read_file(file_path):
    line = file_path.readline()  # Error occurs here
    print(line)

file_path = "example.txt"
read_file(file_path)

Here, the function read_file() is trying to call the readline() method on file_path, which is a string holding the path to the file ("example.txt"). When you run this code, you’ll get the following error:

AttributeError: 'str' object has no attribute 'readline'

Cause of the Error

The problem is that readline() is a method available for file objects, not strings. In the example, file_path is a string containing the file path, not a file object. Therefore, Python raises an AttributeError because the string object does not have the readline() method.

Solution

To fix this issue, you need to open the file and then call readline() on the file object, not the file path. Here’s the corrected version of the code:

def read_file(file_path):
    with open(file_path, "r") as file:
        line = file.readline()
        while line:
            print(line.strip())  # Print each line without the extra newline character
            line = file.readline()

file_path = "example.txt"
read_file(file_path)

When we run the above code we get the following output:

This is the first line of the file.
Here’s the second line.
This is the third line.
The fourth line goes here.
Finally, the fifth line.

Explanation:

  • Opening the File: The with open(file_path, "r") as file: statement opens the file for reading ("r" mode) and assigns it to the variable file, which is a file object.
  • Reading Line by Line: The file.readline() method reads one line at a time from the file, and the while loop continues reading until it reaches the end of the file.
  • Printing Without Extra Newline: The strip() function removes any trailing newline characters from the line before printing.

Alternative Solution Using a For Loop

Alternatively, you can use a for loop to process the file line by line in a more Pythonic way:

def read_file(file_path):
    with open(file_path, "r") as file:
        for line in file:
            print(line.strip())  # Print each line without the extra newline character

file_path = "example.txt"
read_file(file_path)

This version achieves the same result with a more concise approach. The for loop automatically reads each line of the file until the end.

Conclusion

The error AttributeError: 'str' object has no attribute 'readline' is caused by calling the readline() method on a string object rather than on a file object. To fix the error, ensure you open the file using the open() function and call readline() on the file object itself. With the corrected approach, you can process file content line by line without encountering this issue.

Congratulations on reading to the end of this tutorial!

For further reading on AttributeErrors with string objects, go to the articles:

To learn more about Python for data science and machine learning, go to the online courses page on Python for the most comprehensive courses available.

Have fun and happy researching!

Profile Picture
Senior Advisor, Data Science | [email protected] | + posts

Suf is a senior advisor in data science with deep expertise in Natural Language Processing, Complex Networks, and Anomaly Detection. Formerly a postdoctoral research fellow, he applied advanced physics techniques to tackle real-world, data-heavy industry challenges. Before that, he was a particle physicist at the ATLAS Experiment of the Large Hadron Collider. Now, he’s focused on bringing more fun and curiosity to the world of science and research online.

Buy Me a Coffee