This error occurs when you try to close a string instead of a File object.
You can solve this error by keeping the open()
call separate from the read()
call so that the file object and file contents are under different variable names. Then you can close the file once you have accessed the contents.
The preferable way to handle the closing of files is to the with statement as a context manager, for example:
with open("example.txt", "r") as f: content = f.read() print(content)
This tutorial will go through how to solve this error with code examples.
Table of contents
AttributeError: ‘str’ object has no attribute ‘close’
AttributeError occurs in a Python program when we try to access an attribute (method or property) that does not exist for a particular object. The close()
method belongs to the File data type and closes an open file. It is good practice to close files after use. In some cases, changes made to a file may not show until the file is closed.
Example
Let’s look at an example where we want to read the contents of one file and append it to another. The first file contains the names of five celebrities:
Leonardo DiCaprio Michael Jordan Franz Kafka Mahatma Gandhi Albert Einstein
The second file contains the name of another famous historical figure.
Musa Keita I
Let’s look at the code to read the first file and append it’s contents to the second file:
file_content = open("celeb_names.txt", "r").read() file_2 = open("celeb_names_extra.txt", "a").write(file_content) file_content.close()
Let’s run the code to see what happens:
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) Input In [7], in <cell line: 3>() 1 file_content = open("celeb_names.txt", "r").read() 2 file_2 = open("celeb_names_extra.txt", "a").write(file_content) ----> 3 file_content.close() AttributeError: 'str' object has no attribute 'close'
The error occurs because the variable file_content
is a string, which contains the contents of the file and is not the file itself.
Solution #1: Use a context manager
Open files use resources and may be locked, preventing other programs from using them. It is good practice to use the with
statement when accessing files as it automatically closes the file ones the code within its scope has finished. The with statement is the most widely used example of context managers, which allow us to allocate and release resources precisely when we want to. Let’s look at the revised code:
with open("celeb_names.txt", "r") as f, open("celeb_names_extra.txt", "a") as f_new: content = f.read() f_new.write(content)
Note that we can use the with
statement more than one file. We opened the first file in read only mode and the second file in append mode as we do not want to overwrite its contents. We can run the code without error and then check the file celeb_names_extra.txt
from the console to see the following contents:
Musa Keita I Leonardo DiCaprio Michael Jordan Franz Kafka Mahatma Gandhi Albert Einstein
Solution #2: Use close() on File after read()
The alternative way to solve this error is to separate the open()
call from the read()
call. Making this change will ensure the file object and file contents are under separate file names. Then we can close the file object without trying to close the file contents, which is a string. Let’s look at the revised code:
f = open("celeb_names.txt", "r") content = f.read() f_new = open("celeb_names_extra.txt", "a") f_new.write(content) f.close() f_new.close()
We can run the code without error and then check the file celeb_names_extra.txt
from the console to see the following contents:
Musa Keita I Leonardo DiCaprio Michael Jordan Franz Kafka Mahatma Gandhi Albert Einstein
Note that this method requires more lines of code and requires us to remember to close the files. The preferable method is to use the context manager as it automatically closes files after use.
Summary
Congratulations on reading to the end of this tutorial!
For further reading on AttributeErrors, go to the article:
How to Solve Python AttributeError: ‘Response’ object has no attribute ‘read’
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!
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.