2

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

3 に答える 3

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 とイテレータ:

#!/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')
于 2012-11-25T17:56:41.973 に答える
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
于 2012-11-25T17:43:43.690 に答える
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はるかに簡単になります。
于 2012-11-25T17:46:03.717 に答える