简体   繁体   中英

Deleting a specific word form a text file in python

I used this code to delete a word from a text file.

f = open('./test.txt','r')
a = ['word1','word2','word3']
lst = []
for line in f:
    for word in a:
        if word in line:
            line = line.replace(word,'')
    lst.append(line)
f.close()
f = open('./test.txt','w')
for line in lst:
    f.write(line)
f.close()

But for some reason if the words have the same characters, all those characters get deleted. So for eg in my code:

def cancel():
    global refID
    f1=open("refID.txt","r")
    line=f1.readline()
    flag = 0
    while flag==0:
        refID=input("Enter the reference ID or type 'q' to quit: ")
        for i in line.split(','):
            if refID == i:
                flag=1
        if flag ==1:
            print("reference ID found")
            cancelsub()
        elif (len(refID))<1:
            print("Reference ID not found, please re-enter your reference ID\n")
            cancel()
        elif refID=="q":
            flag=1
        else:
            print("reference ID not found\n")
            menu()

def cancelsub():
    global refIDarr, index
    refIDarr=[]
    index=0
    f = open('flightbooking.csv')
    csv_f = csv.reader(f)
    for row in csv_f:
        refIDarr.append(row[1])
    for i in range (len(refIDarr)):
        if refID==refIDarr[i]:
            index=i
            print(index)
    while True:
        proceed=input("You are about to cancel your flight booking, are you sure you would like to proceed? y/n?: ")
        while proceed>"y" or proceed<"n" or (proceed>"n" and proceed<"y") :
            proceed=input("Invalid entry. \nPlease enter y or n: ")
        if proceed=="y":
            Continue()
            break
        elif proceed=="n":
            main_menu
            break    
            exit
        break


def Continue():
    lines = list()
    with open('flightbooking.csv', 'r') as readFile:
        reader = csv.reader(readFile)
        for row in reader:
            lines.append(row)
            for field in row:
                if field ==refID:
                    lines.remove(row)
                    break
    with open('flightbooking.csv', 'w') as writeFile:
            writer = csv.writer(writeFile)
            writer.writerows(lines)
            f = open('refID.txt','r')
            a=refIDarr[index]  
            print(a)
            lst = []
            for line in f:
                for word in a:
                    if word in line:
                        line = line.replace(word,'')
                lst.append(line)
                print(lst)
            f.close()
            f = open('refID.txt','w')
            for line in lst:
                f.write(line)
            f.close()
            print("Booking successfully cancelled")
            menu()

When the code is run, the refID variable has one word stored in it, and it should replace just that word with a blank space, but it takes that word for eg 'AB123', finds all other words which might have an 'A' or a 'B' or the numbers, and replace all of them. How do I make it so it only deletes the word?

Text file before running code: AD123,AB123 Expected Output in the text file: AD123, Output in text file: D, Edit: I have added the entire code, and maybe you can help now after seeing that the array is being appended to and then being used to delete from a text file.

here's my opinion.

refIDarr = ["AB123"]

a = refIDarr[0] => a = "AB123"

strings in python are iterable, so when you do for word in a, you're getting 5 loops where each word is actually a letter.

Something like the following is being executed.

if "A" in line:
    line = line.replace("A","")
if "B" in line:
    line = line.replace("B","")
if "1" in line:
    line = line.replace("1","")
if "2" in line:
    line = line.replace("2","")
if "3" in line:
    line = line.replace("3","")

they correct way to do this is loop over refIDarr

for word in refIDarr:
    line = line.replace(word,'')

NOTE : You don't need the if statement, since if the word is not in the line it will return the same line as it was.

"abc".replace("bananan", "") => "abc"

Here's a working example:

refIDarr = ["hello", "world", "lol"]

with open('mytext.txt', "r") as f:
    data = f.readlines()
    for word in refIDarr:
        data = [line.replace(word, "") for line in data]

with open("mytext.txt", "w") as newf:
    newf.writelines(data)

The problem is here: a=refIDarr[index]

If refIDarr is a list of words, accessing specific index makes a be a word. Later, when you iterate over a ( for word in a: ), word becomes a letter and not a word as you expect, which causes eventually replacing characters of word instead the word itself in your file.

To avoid that, remove a=refIDarr[index] and change your loop to be:

for line in f:
    for word in refIDarr:
        if word in line:
            line = line.replace(word,'')

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM