我正在开发一个项目,我必须管理一个客户列表,它存储在一个txt文件中。我的问题如下,当我使用列表时,我将其上传到内存中的list=[]
变量,然后我使用它,实际上是一个对象列表,当我尝试删除某个对象时出现问题列表中的行,我从list=[]
删除它,之后我用新列表重写txt文件,但问题是我留下了空白行,当我尝试再次执行程序列表时无法阅读。我还想提一下,我做了一个消除空白行的功能,但似乎没有用,有什么帮助吗?
这是消除空白行的功能
def elimina_client(self):
f = open("clienti.txt","r")
lines=f.readlines()
f.close
f = open("clienti.txt","w")
for line in lines:
if line!="":
f.write(line)
这是重写文件的功能
def rescrie_clienti(self):
"""This function rewrites the clienti document"""
with open(self.fisier2,'w') as f:
for i in range(0,len(lista.lista_clienti)):
if i==len(lista.lista_clienti)-1 :
s =str(lista.lista_clienti[i].get_identitate())+","+str(lista.lista_clienti[i].get_nume())+","+str(lista.lista_clienti[i].get_cnp()+","+str(lista.lista_clienti[i].get_filme_inchiriate())+","+str(lista.lista_clienti[i].get_inchirieri()))
f.write("\n")
f.writelines(s)
else:
s =str(lista.lista_clienti[i].get_identitate())+","+str(lista.lista_clienti[i].get_nume())+","+str(lista.lista_clienti[i].get_cnp()+","+str(lista.lista_clienti[i].get_filme_inchiriate())+","+str(lista.lista_clienti[i].get_inchirieri()))
f.writelines(s)
这是从内存列表中删除项目的实际功能
def sterge_client(self,ident):
"Deletes a client from the list"
k=0
for element in self.lista_clienti:
if element.get_identitate()==ident:
self.lista_clienti.remove(element)
k=1
if k==0:
raise RepositoryException(["Nu exista acest ID!"])
这是用来从文件中删除a行的函数,它实际上做的是用没有给定元素的新list=[]
重写列表,然后“消除”空格,但它没有似乎工作,任何人都知道为什么?
def sterge_client2(self,ident):
lista.sterge_client(ident)
self.rescrie_clienti()
self.elimina_client()
答案 0 :(得分:7)
def elimina_client(self):
with open("clienti.txt","r") as f:
lines=f.readlines()
with open("clienti.txt","w") as f:
[f.write(line) for line in lines if line.strip() ]
Python3 with iterators:
#!/usr/bin/env python3
def elimina(fsrc, fdst):
with open(fsrc,'r') as src, open(fdst,'w') as dst:
[ dst.writelines(line) for line in src if line.strip() ]
if __name__ == '__main__':
elimina('text.txt','text_out.txt')
答案 1 :(得分:1)
在删除该行的函数中。不要在循环使用的列表上使用remove()。创建一个包含所需行的临时列表并将其返回:
def sterge_client(self,ident):
"Deletes a client from the list"
k=0
templist = list()
for element in self.lista_clienti:
if element.get_identitate()!= ident:
templist.append(element)
else:
k=1
if k==0:
raise RepositoryException(["Nu exista acest ID!"])
return templist
答案 2 :(得分:1)
迭代列表,从中删除元素并不是一个好主意。我会写下面的方式:
self.lista_clienti = [element for element in self.lista_clienti if element.get_identitate()!=ident]
这将创建所有元素的列表,除了具有给定id的元素,并设置为代替现有元素。
如果您需要验证 - 只需在删除前获取lista_clienti的长度,然后将其与长度进行比较。如果他们是平等的 - 提高错误。
几点注释:
with
语句,在处理文件时,这将确保文件在任何情况下都被关闭。您的elimina_client
功能非常不安全(但当然最好将其删除)。+
连接字符串,使用format语句或.join()方法。 \n
结尾是个好主意 - 这也会使rescrie_clienti
变得更加简单。