Python program to delete a specific line in a text

2019-02-26 16:26发布

问题:

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.

回答1:

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)


回答2:

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()


回答3:

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()


回答4:

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