【问题标题】:How to eliminate blank lines from a file如何消除文件中的空行
【发布时间】:2012-11-25 17:31:57
【问题描述】:

我正在处理一个项目,我必须管理一个客户列表,该列表存储在一个 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() 

【问题讨论】:

  • 如果要将数据库保存在文件中,不妨使用 SQLite。
  • 您需要调用elimina_client函数(f.close(),注意括号)第三行的方法才能正确关闭文件。

标签: python file lines


【解决方案1】:
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:

#!/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')

【讨论】:

  • 使用这样的列表理解来输出是浪费的。考虑使用file.writelines() 或常规的for 循环。
  • 只是说它似乎使用了生成器表达式,即f.writelines(line for line in lines if line.strip()) 也可以“绑定”,甚至更好。
【解决方案2】:

在函数中删除行。不要在您正在循环的列表上使用 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

【讨论】:

  • 是的,但问题是我赢了t be able to use the list=[] again because ive 没有从中删除元素,我需要它来进行一些报告...
【解决方案3】:

迭代列表并从中删除元素并不是一个好主意。我会这样写:

self.lista_clienti = [element for element in self.lista_clienti if element.get_identitate()!=ident]

这将创建所有元素的列表,除了那些具有给定 ID 的元素,并设置在现有元素的位置。

如果您需要验证 - 只需在删除之前获取 lista_clienti 的长度,然后将其与之后的长度进行比较。如果它们相等 - 引发错误。

还有一些注意事项:

  • 总是尝试使用with 语句,在处理文件时,这将确保文件在任何情况下都被关闭。您的 elimina_client 函数非常不安全(当然最好将其删除)。
  • 不要连接字符串,使用+,使用格式语句或.join() 方法。
  • 我认为所有行都以\n 结尾是个好主意——这也会使rescrie_clienti 更简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 2012-06-06
    相关资源
    最近更新 更多