web-dev-qa-db-ja.com

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

このような 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
51
fairyberry

これにより、何をすべきかのアイデアが得られるはずです。

>>> 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. csv.writerlineterminatorパラメーター。デフォルトでは、'\r\n'に設定されており、これが二重のスペースを持っている理由です。
  2. リストを使用してすべての行を追加し、writerowsを使用してそれらを一発で書き込みます。ファイルが非常に大きい場合、これはおそらく良い考えではありませんが(RAM)、通常のファイルの場合は、I/Oが少ないため高速になると思います。
  3. この投稿へのコメントに示されているように、2つのwithステートメントをネストする代わりに、同じ行でネストできることに注意してください。

    open( 'C:/test/test.csv'、 'r')をcsvinputとして、open( 'C:/test/output.csv'、 'w')をcsvoutputとして:

68
joaquin

パンダを提案する人が誰もいなかったことに驚いています。 Pandasのような一連の依存関係を使用すると、このような簡単なタスクに必要なものよりも手間がかかりそうに見えますが、非常に短いスクリプトを生成し、Pandasはすべてを行うための優れたライブラリです各種のCSV(および実際にはすべてのデータ型)データ操作。 4行のコードで議論することはできません。

import pandas as pd
csv_input = pd.read_csv('input.csv')
csv_input['Berries'] = csv_input['Name']
csv_input.to_csv('output.csv', index=False)

Pandas Website をご覧ください!

output.csvの内容:

Name,Code,Berries
blackberry,1,blackberry
wineberry,2,wineberry
rasberry,1,rasberry
blueberry,1,blueberry
mulberry,2,mulberry
46
Blairg23
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):
            if row[0] == "Name":
                writer.writerow(row+["Berry"])
            else:
                writer.writerow(row+[row[0]])

たぶんそのようなものがあなたが意図したものですか?

また、csvはコンマ区切り値を表します。したがって、このように値を区切るにはコンマが必要です。

Name,Code
blackberry,1
wineberry,2
rasberry,1
blueberry,1
mulberry,2
7
jgritty

pandasを使用し、うまく機能しました...使用中に、ファイルを開いてランダムな列を追加し、同じファイルのみに保存する必要がありました。

このコードは複数の列エントリを追加します。必要に応じて編集できます。

import pandas as pd

csv_input = pd.read_csv('testcase.csv')         #reading my csv file
csv_input['Phone1'] = csv_input['Name']         #this would also copy the cell value 
csv_input['Phone2'] = csv_input['Name']
csv_input['Phone3'] = csv_input['Name']
csv_input['Phone4'] = csv_input['Name']
csv_input['Phone5'] = csv_input['Name']
csv_input['Country'] = csv_input['Name']
csv_input['Website'] = csv_input['Name']
csv_input.to_csv('testcase.csv', index=False)   #this writes back to your file

セルの値がコピーされないようにするには、csvファイルに空の列をHours次に、このために上記のコードにこの行を追加できます。

csv_input['New Value'] = csv_input['Hours']

または、手動の列を追加せずに、単にできます。

csv_input['New Value'] = ''    #simple and easy

お役に立てば幸いです。

3

はい、それは古い質問ですが、それはいくつかを助けるかもしれません

import csv
import uuid

# read and write csv files
with open('in_file','r') as r_csvfile:
    with open('out_file','w',newline='') as w_csvfile:

        dict_reader = csv.DictReader(r_csvfile,delimiter='|')
        #add new column with existing
        fieldnames = dict_reader.fieldnames + ['ADDITIONAL_COLUMN']
        writer_csv = csv.DictWriter(w_csvfile,fieldnames,delimiter='|')
        writer_csv.writeheader()


        for row in dict_reader:
            row['ADDITIONAL_COLUMN'] = str(uuid.uuid4().int >> 64) [0:6]
            writer_csv.writerow(row)
1
Tpk43

新しい列を追加する場所がわかりませんが、これを試してください:

    import csv
    i = 0
    Berry = open("newcolumn.csv","r").readlines()
    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[i])
                i++
1
manicphase

このコードはあなたのリクエストで十分であり、私はサンプルコードでテストしました。

import csv

with open(in_path, 'r') as f_in, open(out_path, 'w') as f_out:
    csv_reader = csv.reader(f_in, delimiter=';')
    writer = csv.writer(f_out)

    for row in csv_reader:
    writer.writerow(row + [row[0]]
1
ashwaqar