繁体   English   中英

删除 python 中的文本文件中的特定单词

[英]Deleting a specific word form a text file in python

我使用此代码从文本文件中删除了一个单词。

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

但是由于某种原因,如果单词具有相同的字符,则所有这些字符都会被删除。 因此,例如在我的代码中:

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

运行代码时,refID 变量中存储了一个单词,它应该只用一个空格替换那个单词,但它会将该单词用于例如“AB123”,查找所有其他可能具有“A”的单词或“B”或数字,并替换所有这些。 我怎样才能让它只删除这个词?

运行代码之前的文本文件:AD123,AB123 预期 Output 在文本文件中:AD123, Output 在文本文件中:D,编辑:我已经添加了整个代码,也许你现在可以在看到数组被附加到和后提供帮助然后用于从文本文件中删除。

这是我的意见。

refIDarr = [“AB123”]

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

python 中的字符串是可迭代的,所以当你在 a 中做 for word 时,你会得到 5 个循环,其中每个单词实际上都是一个字母。

正在执行类似以下的操作。

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","")

他们这样做的正确方法是循环refIDarr

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

注意:您不需要 if 语句,因为如果单词不在行中,它将返回与原来相同的行。

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

这是一个工作示例:

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)

问题出在这里: a=refIDarr[index]

如果refIDarr是单词列表,则访问特定索引会使a成为单词。 稍后,当您迭代a ( for word in a: ) 时, word变成了一个字母,而不是您期望的单词,这导致最终替换 word 的字符而不是文件中的单词本身。

为避免这种情况,请删除a=refIDarr[index]并将循环更改为:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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