Как добавить новый столбец в файл 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
Ответы
Ответ 1
Это должно дать вам представление о том, что делать:
>>> 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)
Спасибо, что приняли ответ. Здесь у вас есть бонус (ваш рабочий script):
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)
Обратите внимание:
- параметр
lineterminator
в csv.writer
. По умолчанию это
установлен на '\r\n'
, и поэтому у вас двойной интервал.
- использование списка для добавления всех строк и их записи в
один снимок с
writerows
. Если ваш файл очень, очень большой, это
вероятно, это не очень хорошая идея (ОЗУ), но для нормальных файлов я думаю, что это
быстрее, потому что меньше ввода/вывода.
-
Как указано в комментариях к этому сообщению, обратите внимание, что вместо
вложенные два оператора with
, вы можете сделать это в одной строке:
с открытым ('C:/test/test.csv', 'r') как csvinput, open ('C:/test/output.csv', 'w') как csvoutput:
Ответ 2
Я удивлен, что никто не предложил Pandas. Хотя использование набора зависимостей типа Pandas может показаться более тяжелым, чем это необходимо для такой простой задачи, оно создает очень короткий script и 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 Веб-сайт для получения дополнительной информации!
Содержание output.csv
:
Name,Code,Berries
blackberry,1,blackberry
wineberry,2,wineberry
rasberry,1,rasberry
blueberry,1,blueberry
mulberry,2,mulberry
Ответ 3
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
Ответ 4
Я использовал 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 вручную, например, вы назвали его Часами
то теперь для этого вы можете добавить эту строку в код выше,
csv_input['New Value'] = csv_input['Hours']
или просто мы можем, не добавляя ручную колонку, мы можем
csv_input['New Value'] = '' #simple and easy
Надеюсь, что это поможет.
Ответ 5
Я не вижу, где вы добавляете новый столбец, но попробуйте следующее:
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++
Ответ 6
Этот код будет достаточно для вашего запроса, и я проверил на примере кода.
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]]
Ответ 7
Да, это старый вопрос, но это может помочь некоторым
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)