2016-12-01 132 views
2

我遇到的另一个问题是,我有此代码从文本文件中删除名称。我不完全确定为什么,但有时它可以正常工作,并删除了名称,但通常情况并非如此,是否有更好的方法可以在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

从只盯着你的代码我最好的猜测是,它与'leavingParticipant +“\ n”来办'...你可以粘贴一些样本数据? – anshanno

回答

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语句)手动关闭文件。与其试图围绕我们需要的信息播放空白,我们只是将其删除以供比较。

+0

谢谢,没有改变我做过的很多东西 – WhatsThePoint

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) 
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)) 
+1

@Patrick:这是不正确的。使用'in'在字符串列表中搜索完全匹配。它不会将搜索映射到列表中的每个字符串中。 – James