Как добавить новый столбец в файл 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)

Но в выводе скрипт пропускает каждую строку, и в новом столбце есть только Берри:

Output
Name        Code    Berry
blackberry  1   Berry

wineberry   2   Berry

rasberry    1   Berry

blueberry   1   Berry

mulberry    2   Berry
 Martijn Pieters♦17 июн. 2012 г., 12:12
возможный дубликатCopy one column to another but with different header
 Hemanth Kumar12 окт. 2018 г., 06:58
Вы также используете фрейм данных панд, как предлагается в этомpage
 fairyberry17 июн. 2012 г., 12:31
@Dhara: я бы хотел, чтобы Berry использовался в качестве заголовка, а значение столбца Name - в качестве значения строки для Berry. Смотри выше.
 Dhara17 июн. 2012 г., 12:16
возможно ли, что у вас есть только «Ягода»? в вашем последнем столбце, потому что вы пишете только «Ягода»; в файл? (строка + ['Berry']) Что вы ожидали написать?

Ответы на вопрос(7)

Этот код будет достаточно для вашего запроса, и я проверил на примере кода.

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]]

Да, это старый вопрос, но это может помочь некоторым

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)

Я не вижу, куда вы добавляете новый столбец, но попробуйте это:

    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++
 17 июн. 2012 г., 12:53
опять же, это работает?

Я использовал панд, и это работало хорошо ... Пока я его использовал, мне пришлось открыть файл и добавить в него несколько случайных столбцов, а затем сохранить обратно только в тот же файл.

Этот код добавляет несколько записей столбцов, вы можете редактировать столько, сколько вам нужно.

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

I Hope it helps.

Я удивлен, что никто не предложил Панд. Хотя использование набора зависимостей, таких как 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)

Проверять, выписыватьсяСайт Панд для дополнительной информации!

Содержаниеoutput.csv:

Name,Code,Berries
blackberry,1,blackberry
wineberry,2,wineberry
rasberry,1,rasberry
blueberry,1,blueberry
mulberry,2,mulberry
 02 июл. 2017 г., 15:07
Вот это да. удивительное предложение!
 28 февр. 2017 г., 09:27
Спасибо @ Jough Демпси!
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
 17 июн. 2012 г., 12:30
Я исправил это, так оно и есть, но его input.csv тоже неверен.
 fairyberry17 июн. 2012 г., 13:34
@jgritty: спасибо за вашу помощь.
 10 июн. 2016 г., 17:07
Создайте новый вопрос о переполнении стека.
 17 июн. 2012 г., 12:28
Это работает ?
Решение Вопроса

Это должно дать вам представление о том, что делать:

>>> 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)

пожалуйста, обратите внимание

the lineterminator parameter in csv.writer. By default it is set to '\r\n' and this is why you have double spacing. the use of a list to append all the lines and to write them in one shot with writerows. If your file is very, very big this probably is not a good idea (RAM) but for normal files I think it is faster because there is less I/O.

As indicated in the comments to this post, note that instead of nesting the two with statements, you can do it in the same line:

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

 fairyberry17 июн. 2012 г., 13:11
это работает сейчас. Спасибо большое за вашу помощь!!
 30 июн. 2016 г., 17:51
Примечание: вместо вложенияwith операторы, вы можете сделать это в той же строке, разделяя их запятой, например:with open(input_filename) as input_file, open(output_filename, 'w') as output_file
 fairyberry17 июн. 2012 г., 12:44
спасибо за примечание Я попытался, и это дает мне ошибку атрибута: & amp; _csv.reader & apos; У объекта нет атрибута «следующий». Есть ли у вас какие-либо идеи?
 fairyberry25 июн. 2012 г., 15:44
& # xFF20; Хоакин: OMG. Спасибо за бонус !!
 17 июн. 2012 г., 12:52
Я вижу, ты в py3k. тогда вы должны использовать next (r) вместо r.next ()

Ваш ответ на вопрос