1

出力 csv ファイルに複数の書き込みを行うことなく、csv ファイルのほとんどの行に対して複数の編集を実行したいと考えています。

別のプログラムが使用できるように、特定の形式に変換してクリーンアップする必要がある csv があります。たとえば、次のようにしたいと思います。

  1. すべての空白行を削除
  2. 列「B」の値が数値でないすべての行を削除します
  3. この新しいデータを使用して、新しい列を作成し、列 B の値の最初の部分を新しい列に分解します

データの例を次に示します。

"A","B","C","D","E"
"apple","blah","1","","0.00"
"ape","12_fun","53","25","1.00"

"aloe","15_001","51","28",2.00"

各プロセスの背後にあるロジックを理解することはできますが、理解できないのは、毎回ファイルを読み書きせずに各プロセスを実行する方法です。私はCSVモジュールを使用しています。最終的な CSV を作成する前に、これらの手順を一度に実行するより良い方法はありますか?

4

3 に答える 3

1

一連のテストと一連のプロセスを定義します。

すべてのテストに合格すると、すべてのプロセスが適用され、最終結果が出力に書き込まれます。

import csv

#
# Row tests
#

def test_notblank(row):
    return any(len(i) for i in row)

def test_bnumeric(row):
    return row[1].isdigit()

def do_tests(row, tests=[test_notblank, test_bnumeric]):
    return all(t(row) for t in tests)

#
# Row processing
#

def process_splitb(row):
    b = row[1].split('.')
    row[1] = b[0]
    row.append(b[1])
    return row

def do_processes(row, processes=[process_splitb]):
    for p in processes:
        row = p(row)
    return row

def main():
    with open("in.csv","rb") as inf, open("out.csv","wb") as outf:
        incsv = csv.reader(inf)
        outcsv = csv.writer(outf)

        outcsv.writerow(incsv.next())    # pass header row
        outcsv.writerows(do_processes(row) for row in incsv if do_tests(row))

if __name__=="__main__":
    main()
于 2012-06-06T01:02:43.850 に答える
0

シンプルな for ループ。

import csv

csv_file = open('in.csv', 'rb')
csv_reader = csv.reader(csv_file)

header = csv_reader.next()
header.append('F') #add new column

records = [header]

#process records
for record in csv_reader:
    #skip blank records
    if record == []:
        continue
    #make sure column "B" has 2 parts
    try:
        part1, part2 = record[1].split('_')
    except:
        continue
    #make sure part1 is a digit
    if not part1.isdigit():
        continue
    record[1] = part1 #make column B equal part1
    record.append(part2) #add data for the new column F to record
    records.append(record)

new_csv_file = open('out.csv', 'wb')
csv_writer = csv.writer(new_csv_file, quoting=csv.QUOTE_ALL)

for r in records:
    csv_writer.writerow(r)
于 2012-06-06T01:48:00.303 に答える
-1

CSVモジュールを使用する理由。CSVはテキスト行(文字列)で構成されており、Pythonの文字列パワー(分割、結合、置換、長さ)を使用して結果を作成できます。

line_cols = line.split('、')and back:line ='、' .join(line_cols)

于 2012-06-06T00:24:53.400 に答える