This question already has an answer here:
-
using Python for deleting a specific line in a file
14 answers
I have a text file Thailand_Rectangle2_National Parks.txt with the following lines.
1
2
3
4
5
dy 0.5965
7
Now, I want to delete the 6th line in this text file.
For that, I am using the following python code.
f = open("C:/Users/Sreeraj/Desktop/Thailand_Rectangle2_National Parks.txt","r")
lines = f.readlines()
So, I saved all the lines of this text file in 'lines'.
line6 = lines[5]
t = line6[:2]
f.close()
So, now, I have 't' = "dy" . Now,
if t == "dy":
f = open("C:/Users/Sreeraj/Desktop/Thailand_Rectangle2_National Parks.txt","w")
for line in lines:
if lines[5] != line6:
f.write(line)
f.close()
So, if the condition 't' = "dy" satisfies, then I will open this text file for writing and I will print all the lines except line6 (which means line6 is deleted from this text file).
Unfortunately, I am getting the lines in this text file as blank, which means no lines are printed as outputs.
But, I want the lines in the text file as given below.
1
2
3
4
5
7
How can I solve this issue ?
I want to use only Python programming to solve this issue; since this is a small task of a major work.
Your problem is that lines[5]
will always be equal to line6
. You never modified the sixth line in lines
, so line6
and lines[5]
are still equal. Thus, the condition lines[5] != line6
will always fail.
If you want to always remove the sixth line from your file, you can use enumerate
. For example:
with open("file.txt", "r") as infile:
lines = infile.readlines()
with open("file.txt", "w") as outfile:
for pos, line in enumerate(lines):
if pos != 5:
outfile.write(line)
You should check your logic and variable names. You're checking if lines[5] is not equal to line6, everytime in your loop. Which it is, because it IS that exact line. You want the check the current line:
if t == "dy":
f = open("C:/Users/Sreeraj/Desktop/Thailand_Rectangle2_National Parks.txt","w")
for line in lines:
if line != line6: # <- Check actual line!
f.write(line)
f.close()
The actual error in your way to do this was already pointed out, but instead of comparing the content of each line, I recommend you simply compare the line number or use startswith
. Otherwise you are doing a lot of unneeded string comparisons, which can be costly.
Other improvements could be to handle your file using with
, opening the file only once and allowing to delete multiple lines at once.
# 'r+' allows you to read and write to a file
with open("C:/Users/Sreeraj/Desktop/Thailand_Rectangle2_National Parks.txt","r+") as f:
for line in f.readlines():
if not line.startwith('dy'):
f.write(line)
# Truncate the remaining of the file
f.truncate()
You know that line6 == lines[5], so the condition
if lines[5] != line6:
is never true and thus you never write anything to the file