我遇到的另一个问题是,我有这段代码从文本文件中删除一个名字。我不确定为什么,但有时它工作正常并删除了名称,但通常它没有,是否有更好的方法这样做100%的时间?我已经改变了我的文件路径和文件名,因为你们不需要它。
with open(r"MyFilePath\MyFile.txt","r") as file:
participants=[]
for line in file:
participants.append(line)
file.close()
leavingParticipant=input("Enter leaving participant: ")
file=open(r"MyFilePath\MyFile.txt","w")
for participant in participants:
if participant!=leavingParticipant+"\n":
file.write(participant)
file.close()
答案 0 :(得分:2)
首先,您不需要读取行并将它们手动附加到列表中,因为无论何时打开文件,open()
函数都会返回一个文件对象,该对象是一个包含所有行的类似迭代器的对象。或者,如果要缓存它们,可以使用readlines()
方法。
其次,当您使用with
语句时,您不需要关闭该文件,这正是其关闭块末尾文件的作业之一。
考虑到上述注意事项,您可以选择执行此操作,最好的选项是使用临时文件对象一次读取和修改文件。幸运的是,python为我们提供了tempfile
模块,在这种情况下你可以使用NamedTemporaryFile
方法。并使用shutil.move()
将临时文件替换为当前文件。
import tempfile
import shutil
leavingParticipant=input("Enter leaving participant: ")
filename = 'filename'
with open(filename, 'rb') as inp, tempfile.NamedTemporaryFile(mode='wb', delete=False) as out:
for line if inp:
if line != leavingParticipant:
put.write(line)
shutil.move(out.name, filename)
答案 1 :(得分:2)
with open(r"MyFilePath\MyFile.txt","r") as file:
participants=[]
for line in file:
participants.append(line)
leavingParticipant=input("Enter leaving participant: ")
with open(r"MyFilePath\MyFile.txt","w") as file:
for participant in participants:
if leavingParticipant != participant.strip():
file.write(participant)
您无需手动关闭上下文管理器中的文件(with..as
语句)。我们不需要尝试使用我们需要的信息周围的空白,而是将其删除以进行比较。
答案 2 :(得分:0)
让我们重新编写一些代码。首先file
是保留字,所以最好不要超载它。其次,由于您使用with
打开文件,因此无需使用.close()
。当with
子句结束时,它会自动执行此操作。您无需遍历参与者列表。有几种方法可以处理从列表中删除项目。在这里使用.remove(item)
可能是最合适的。
with open(r"MyFilePath\MyFile.txt","r") as fp:
participants=[]
for line in fp:
participants.append(line.strip()) #remove the newline character
leavingParticipant = input("Enter leaving participant: ")
with open(r"MyFilePath\MyFile.txt","w") as fp2:
if leavingParticipant in participants:
participant.remove(leavingParticipant)
file.write('\n'.join(participant))