1

csv から特定のパターンの行を削除する必要があります

これが私のcsvファイルの外観です。

lbm,16730,0
namd,16733,6
namd,16731,2
namd,16732,4

16730パターンのある行を削除し、残りのファイルをそのまま出力したい場合..

したがって、出力は次のようになります。

namd,16733,6
namd,16731,2
namd,16732,4

それ、どうやったら出来るの?

これは、インターネット上のいくつかのファイルの助けを借りて書いた小さなスクリプトです

def delete_line(dello):
    opener = open(input_csv, 'rb')
    dataset = csv.reader(opener, delimiter=',')
    output = []
    for line in dataset:
            if 'dello' == line[1]:
                    print line[1]
                    #i dont know how to strip it here
                    output.append(line)
    opener.close()
    fn = input_csv
    f = open(fn,'w')
    f.writelines(output)
    f.close()

私が間違っているヒントはありますか?

4

4 に答える 4

1

uʍopǝpısdnの提案に従い、grepを選択する場合は、次のように機能します。

grep -v ",16370," path/to/file > path/to/new_file

ただし、ファイルの構造がサンプルの構造に似ており、すべてのファイルで一貫していると仮定します...

参考までに、grepでは、-vは逆一致を示し、指定されたパターンを含まないすべての結果を返します。

編集:元のファイルを保持する必要がある場合は、一時ファイルを使用してから、その名前を元のファイルに復元できます。

grep -v ",16370," path/to/file > path/to/new_file && rm path/to/file && mv path/to/new_file path/to/file
于 2013-02-05T18:47:01.130 に答える
1

Python が必要な場合は、これを使用します。

def delete_line(dello):
    data = open("abc.csv").readlines()

    i = 0
    for line in data:
        if dello in line:
            data.pop(i)
        i += 1

    open("abc.csv", "w").write("".join(data))

delete_line("16732")

入力:

lbm,16730,0
namd,16733,6
namd,16731,2
namd,16732,4

出力:

lbm,16730,0
namd,16733,6
namd,16731,2

注: これにより、文字列に一致するすべてのエントリが削除されます。


アップデート

コードの変更:

import csv

def delete_line(dello):
    opener = open("abc.csv", 'rb')
    dataset = csv.reader(opener, delimiter=',')
    output = []
    for line in dataset:
        # Add to output only if not matching the string
        if dello != line[1]:
            # Need join as line is a list
            output.append(",".join(line) + "\n")
    opener.close()

    fn = "abc.csv"
    f = open(fn,'w')
    f.writelines(output)
    f.close()

delete_line("16730")

エントリを削除する必要がある場合は、 を使用できますdataset.pop(index)

于 2013-02-05T18:59:20.343 に答える
0

最初の問題:

if 'dello' == line[1]:
  1. あなたはdello引用で参照します
  2. 論理が逆になります。

したがって、正しいテストは次のようになります。

if dello != line[1]:

2番目の問題:ファイルをCSVとして読み取りますが、通常のファイルとして書き出します。通常のテキストファイルまたはCSVとしての読み取りと書き込みのいずれかで一貫性を保つ必要があります。それらを混同すると、正しい出力を得るのが難しくなります。

3つ目は実際には問題ではありませんが、提案です。ファイル名をハードコーディングせずに、関数に渡します。そうすれば、あなたの機能はより用途が広くなります。

これが私の提案したコードです:

def delete_line(input_csv, dello):
    with open(input_csv, 'rb') as f:
        csv_reader = csv.reader(f)
        output = []
        for line in csv_reader:
            if dello not in line:
                output.append(line)

    with open(input_csv, 'wb') as f:
        csv_writer = csv.writer(f)
        csv_writer.writerows(output)
于 2013-02-05T19:21:36.547 に答える
0

そのような python スクリプトを実行するには、次の 2 つの方法があります。

最初: 次のようなメインセクションをファイルに追加します。

if __name__ == "__main__":
    delete_line(some_paramter)

次に、コマンドラインから実行します。

python scriptfilename.py

または python シェルから:

from scriptfilename import delete_line
delete_line(some_parameter)

それらのいずれかを使用しますか?スクリプト自体は実行されません。

あなたのスクリプトに関するいくつかの不明なビジネス:

  1. スクリプトで使用される入力変数 dello は正確には何ですか。文字列 'dello' を使用している行がありますが、パラメーター dello は使用していません。ここで何をしようとしましたか

  2. input_csv ファイルと同じフォルダーで実行していますか。input_csv は完全なファイル名、または input_csv.csv です。

  3. input_csv を変数として使用していますが、これは空で失敗します。これがファイル名を保持する変数でない場合 (ファイル内の他の場所から)、ファイル名を文字列として呼び出す必要があります。'input_csv.csv'

  4. あなたはコメントしました: #私はここでそれを取り除く方法を知りませんか? 質問は正確には何ですか?それはどういう意味ですか?strip() を使用します。他の何か?

  5. あなたのスクリプトは関数の前に csv をインポートしましたか? そうでない場合..何も機能しません。

  6. ファイルを操作するときは、常にこれを使用することをお勧めwithします。例外と自動ファイル クローズを処理します。それについては多くの場所で読むことができます。

何かのようなもの:

with open('file.csv','rb') as f:
    dataset = csv.reader(f)
    #the rest. and you don't need closing etc..'
于 2013-02-05T19:01:25.790 に答える