0

csv をリストに読み込んでいますが、特定の条件下でリストから行全体を削除する必要があります。

import csv

thefile = []

def dowork():
    sourceFile='e.csv'
    CleanFile(sourceFile)

def CleanFile(sourceFile):
    global thefile
    thefile=list(csv.reader(open(sourceFile, 'rb'), delimiter=',', quotechar='"'))
    for line in thefile:
        if line[3]=='':
            #here's where i need to delete line from thefile

lineから削除するにはどうすればよいthefileですか?

4

2 に答える 2

4

linewithinのインデックスが必要ですthefile。それができたら、あとは簡単です。そして、それを取得する方法はenumerateを使用することです。

def CleanFile(sourceFile):
    global thefile
    thefile=list(csv.reader(open(sourceFile, 'rb'), delimiter=',', quotechar='"'))
    for i, line in enumerate(thefile):
        if line[3]=='':
            del thefile[i]

ただし、実際に削除する必要があるかどうかを尋ねる価値があります。たとえば、このようにフィルタリングできますか?

def CleanFile(sourceFile):
    global thefile
    thefile=[line for line in 
             csv.reader(open(sourceFile, 'rb'), delimiter=',', quotechar='"')) 
             if line[3] != '']

line[3] == ''または、データで何をしているかによっては、出力時または計算時に行をスキップする方が理にかなっているかもしれません。または、そもそもリストを作成しない方がよいでしょう。csv.reader をイテレータのままにしておくだけです。その後itertools.ifilter、 、またはジェネレータ式を介してその前にフィルタを貼り付けることができます。実際、これは 2 つの文字を変更するだけの簡単なものです。

def CleanFile(sourceFile):
    global thefile
    thefile=(line for line in 
             csv.reader(open(sourceFile, 'rb'), delimiter=',', quotechar='"')) 
             if line[3] != '')

もちろん、たとえば へのランダムアクセスが必要な場合、これは意味がありませんthefile。しかし、行ごとに繰り返す場合は、これがおそらく最良の解決策です。(それはグローバルであってはならないことを除いてthefile、必要に応じて関数から関数へ渡されるべきです。)

于 2012-09-25T22:14:04.567 に答える
1

フィルターを使用してみてください:

def CleanFile(sourceFile):
   global thefile
   thefile=list(csv.reader(open(sourceFile, 'rb'), delimiter=',', quotechar='"'))

   def f(x): return x[3] != ''
   thefile = filter(f, thefile)

   return thefile
于 2012-09-25T22:18:27.557 に答える