1. ホーム
  2. python

CSVファイルに新しい列を追加する方法は?

2023-08-04 15:22:36

質問

私はいくつかの CSV ファイルには、次のようなものがあります。

Input
Name        Code
blackberry  1
wineberry   2
rasberry    1
blueberry   1
mulberry    2

すべてのCSVファイルに新しいカラムを追加して、次のように表示させたい。

Output
Name        Code    Berry
blackberry  1   blackberry
wineberry   2   wineberry
rasberry    1   rasberry
blueberry   1   blueberry
mulberry    2   mulberry

今までのスクリプトはこれです。

import csv
with open(input.csv,'r') as csvinput:
    with open(output.csv, 'w') as csvoutput:
        writer = csv.writer(csvoutput)
        for row in csv.reader(csvinput):
            writer.writerow(row+['Berry'])

(Python 3.2)

しかし、出力では、スクリプトはすべての行をスキップし、新しいカラムにはBerryだけがあります。

Output
Name        Code    Berry
blackberry  1   Berry

wineberry   2   Berry

rasberry    1   Berry

blueberry   1   Berry

mulberry    2   Berry

どのように解決するのですか?

これは、何をすべきかについてのアイデアを与えるはずです。

>>> v = open('C:/test/test.csv')
>>> r = csv.reader(v)
>>> row0 = r.next()
>>> row0.append('berry')
>>> print row0
['Name', 'Code', 'berry']
>>> for item in r:
...     item.append(item[0])
...     print item
...     
['blackberry', '1', 'blackberry']
['wineberry', '2', 'wineberry']
['rasberry', '1', 'rasberry']
['blueberry', '1', 'blueberry']
['mulberry', '2', 'mulberry']
>>> 

編集、py3kでは next(r)

回答を受け入れてくれてありがとうございます。ここにボーナス(あなたの作業スクリプト)があります。

import csv

with open('C:/test/test.csv','r') as csvinput:
    with open('C:/test/output.csv', 'w') as csvoutput:
        writer = csv.writer(csvoutput, lineterminator='\n')
        reader = csv.reader(csvinput)

        all = []
        row = next(reader)
        row.append('Berry')
        all.append(row)

        for row in reader:
            row.append(row[0])
            all.append(row)

        writer.writerows(all)

ご注意ください

  1. lineterminator のパラメータは csv.writer . デフォルトでは、このパラメータは に設定されています。 '\r\n' に設定されており、これがダブルスペースになる理由です。
  2. を使うことで、すべての行を追加して一度に書き出すことができます。 で一発書き。 writerows . ファイルが非常に大きい場合、これは しかし、通常のファイルであれば、I/Oが少ないので、この方が高速だと思います。 より少ない I/O であるため、より高速であると思います。
  3. この投稿へのコメントで示されたように、この記事では を入れ子にするのではなく、2 つの with ステートメントを入れ子にする代わりに、同じ行で行うことができることに注意してください。

    open('C:/test/test.csv','r') as csvinput, open('C:/test/output.csv','w') as csvoutputで、次のようになります。