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

fai*_*rry 57 python csv python-3.x

我有几个CSV文件,如下所示:

Input
Name        Code
blackberry  1
wineberry   2
rasberry    1
blueberry   1
mulberry    2
Run Code Online (Sandbox Code Playgroud)

我想为所有CSV文件添加一个新列,以便它看起来像这样:

Output
Name        Code    Berry
blackberry  1   blackberry
wineberry   2   wineberry
rasberry    1   rasberry
blueberry   1   blueberry
mulberry    2   mulberry
Run Code Online (Sandbox Code Playgroud)

我到目前为止的脚本是这样的:

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'])
Run Code Online (Sandbox Code Playgroud)

(Python 3.2)

但是在输出中,脚本会跳过每一行,而新列中只有Berry:

Output
Name        Code    Berry
blackberry  1   Berry

wineberry   2   Berry

rasberry    1   Berry

blueberry   1   Berry

mulberry    2   Berry
Run Code Online (Sandbox Code Playgroud)

joa*_*uin 73

这应该让你知道该怎么做:

>>> 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']
>>> 
Run Code Online (Sandbox Code Playgroud)

编辑,注意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)
Run Code Online (Sandbox Code Playgroud)

请注意

  1. 中的lineterminator参数csv.writer.默认设置为'\r\n',这就是你有双倍间距的原因.
  2. 使用列表附加所有行并用一次性写入它们writerows.如果您的文件非常非常大,这可能不是一个好主意(RAM),但对于普通文件,我认为它更快,因为I/O较少.
  3. 如本文的评论中所示,请注意with,您可以在同一行中执行此操作,而不是嵌套这两个语句:

    open('C:/test/test.csv','r')为csvinput,open('C:/test/output.csv','w')为csvoutput:

  • 注意:代替嵌套`with`语句,你可以在同一行用逗号分隔它们,例如:`open(input_filename)as input_file,open(output_filename,'w')as output_file` (7认同)

Bla*_*g23 52

我很惊讶没有人建议熊猫.尽管使用像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)
Run Code Online (Sandbox Code Playgroud)

查看Pandas网站了解更多信息!

内容output.csv:

Name,Code,Berries
blackberry,1,blackberry
wineberry,2,wineberry
rasberry,1,rasberry
blueberry,1,blueberry
mulberry,2,mulberry
Run Code Online (Sandbox Code Playgroud)

  • @pedrostrusso 但除非你加载 4-16 GB 文件,否则你应该在 RAM 上表现良好。除非你用土豆。 (2认同)

jgr*_*tty 8

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]])
Run Code Online (Sandbox Code Playgroud)

也许这样的东西是你想要的?

此外,csv代表逗号分隔值.所以,你需要用逗号分隔你的价值观,我认为:

Name,Code
blackberry,1
wineberry,2
rasberry,1
blueberry,1
mulberry,2
Run Code Online (Sandbox Code Playgroud)


giv*_*rld 6

我使用了熊猫,它运行良好......当我使用它时,我不得不打开一个文件并向其中添加一些随机列,然后只保存回同一个文件。

此代码添加了多个列条目,您可以根据需要进行编辑。

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
Run Code Online (Sandbox Code Playgroud)

如果您希望该单元格值不会被复制,那么首先在您的 csv 文件中手动创建一个空列,就像您将其命名为“小时”一样 ,现在为此您可以在上面的代码中添加这一行,

csv_input['New Value'] = csv_input['Hours']
Run Code Online (Sandbox Code Playgroud)

或者干脆我们可以,不添加手动列,我们可以

csv_input['New Value'] = ''    #simple and easy
Run Code Online (Sandbox Code Playgroud)

我希望它有帮助。


小智 5

是的,这是一个老问题,但可能会有所帮助

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)
Run Code Online (Sandbox Code Playgroud)