如何将新列添加到CSV文件?

问题描述 投票:51回答:7

我有一个看起来像这样几个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)

但在输出时,脚本跳过每行和新列只有在贝里它:

Output
Name        Code    Berry
blackberry  1   Berry

wineberry   2   Berry

rasberry    1   Berry

blueberry   1   Berry

mulberry    2   Berry
python csv python-3.x
7个回答
70
投票

这应该给你做什么的想法:

>>> 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. lineterminatorcsv.writer参数。默认情况下,它被设置为'\r\n',这就是为什么你必须双倍行距。
  2. 使用列表的追加所有行,并把它们写在一个投篮writerows。如果你的文件是非常非常大的,这可能是不是一个好主意(RAM),但是对于普通的文件,我想这是更快,因为更少的I / O。
  3. 正如评论这篇文章指出,注意,代替嵌套两个with语句,你可以在同一行做到这一点: 具有开放( 'C:/test/test.csv', 'R')作为csvinput,开放( 'C:/test/output.csv', 'W'),为csvoutput:

46
投票

我很惊讶,没有一个人提出大熊猫。虽然使用了一组像熊猫的依赖似乎更严厉的比是必要的一件容易的事,它会产生一个很短的脚本,大熊猫是做各种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

7
投票
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

3
投票

我用大熊猫和它的工作好...当我使用它,我不得不打开一个文件,并添加一些随机列,然后保存回只有同一个文件。

此代码添加多个列条目,您可以编辑尽可能多的需要。

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文件中的空列,就像你把它命名为小时,然后,现在对于这一点,你可以在上面的代码中加入这一行,

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

或简单地就可以了,而不添加人工列,我们可以

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

我希望它能帮助。


1
投票

我没有看到你添加新的列,但试试这个:

    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
投票

这段代码就足够了你的要求,我在对样本代码进行测试。

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
投票

它是一个老问题,但它可能会帮助一些

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)
© www.soinside.com 2019 - 2024. All rights reserved.