Difference between write and writelines in Python
-
Use the
write()andwritelines()Methods to Write Specified Text to a File in Python -
Use the
write()andwritelines()Methods to Write Iterables to a File in Python
This tutorial will introduce and explain the difference between the write() and writelines() methods in Python.
Use the write() and writelines() Methods to Write Specified Text to a File in Python
The write() method expects a string as an argument and writes it to the file. If we provide a list of strings, it will raise an exception. The writelines() method expects an iterable argument. Also, the write() method displays the output but does not provide a new line character, whereas the writelines() method displays the output and provides a new line character at the end of the string. It is important to note that writelines() do not automatically insert a new line after each item in the iterable. We have to provide a new line by ourselves. If we have many lines to write to a file, writelines() could be a better option. It performs well because it doesn’t create a temporary concatenated string, just iterating over the lines.
In the program below, we opened the file samplefile.txt in the write mode. The lines variable is a tuple, i.e., an immutable collection of strings. When we try to execute the program, it raised an exception-type error. The arguments we provided to the write() method is a tuple that caused the error. Here, we used the with method for file handling. This method provides better syntax and exception handling. So, it is a good practice to use the with method where applicable. The method is helpful because any files opened will be closed after one is done.
Example Code:
# python 3.x
nl = "\n"
line1 = "Good"
line2 = "Morning"
line3 = "Sunshine"
lines = line1, nl, line2, nl, line3, nl
with open("samplefile.txt", "w") as f:
f.write(lines)
Output:
TypeError: write() argument must be str, not tuple
In a similar context, when we use writelines(), the program is executed successfully, and a file named samplefile.txt is created where lines is passed as an argument to the writelines() method.
Example Code:
# python 3.x
nl = "\n"
line1 = "Good"
line2 = "Morning"
line3 = "Sunshine"
lines = line1, nl, line2, nl, line3, nl
with open("samplefile.txt", "w") as f:
f.writelines(lines)
Output:
Good
Morning
Sunshine
For the same program, the multiple lines are concatenated to a single string variable called lines_joined, which is easily accepted as an argument for the write() method.
Example Code:
# python 3.x
nl = "\n"
line1 = "Good"
line2 = "Morning"
line3 = "Sunshine"
lines_joined = line1 + nl + line2 + nl + line3 + nl
with open("samplefile.txt", "w") as f:
f.write(lines_joined)
Output:
Good
Morning
Sunshine
Use the write() and writelines() Methods to Write Iterables to a File in Python
The join() method takes all items in an iterable and joins them into one string. In the program below, we used the join() method with '\n' as a glue to concatenate the string in lines. It is a better approach for concatenation instead of using the + operator.
Example Code:
# python 3.x
lines = ["Hello", "World"]
with open("hello.txt", "w") as f:
f.write("\n".join(lines))
Output:
Hello
World
It is less efficient to use the join() method for an extremely long list of strings. In such a case, an entirely new and very long string is created in memory before writing it. So, in the program below, we used a generator expression to write the strings in the newline. Here, the data is written piece-wise.
Example Code:
# python 3.x
lines = ["Hello", "World"]
with open("hello.txt", "w") as f:
for l in lines:
f.write("%s\n" % l)
Output:
Hello
World
The same program as above is implemented through the writelines() method. It makes the use of a generator expression and dynamically creates newline-terminated strings. The writelines() method iterates over this sequence of strings and writes every item.
Example Code:
# python 3.x
lines = ["Hello", "World"]
with open("hello.txt", "w") as file:
file.writelines("%s\n" % t for t in texts)
Output:
Hello
World