2015-04-20 3 views
1

Я работаю с файлами csv, и кажется, что python обеспечивает большую гибкость при обработке файлов csv.Добавление столбца между столбцами в csv Python

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

Мой исходный файл CSV пункт выглядит следующим образом (обратите внимание, что только один столбец в заголовке» 'строка):

 
FILE1 
Z1 20 44 3 
Z1 21 44 5 
Z1 21 44 8 
Z1 22 45 10 

То, что я хочу сделать, это добавить колонку между Cols # 1 и # 2, и держать все остальное без изменений. Этот новый столбец имеет те же # строки, что и другие столбцы, но содержит одно и то же целое число для всех записей (10 в моем примере ниже). Еще один важный момент, я не знаю, количество строк, так что я, возможно, придется пересчитать # строк как-то первый мой выход должен выглядеть так (?):

 
FILE1 
Z1 10 20 44 3 
Z1 10 21 44 5 
Z1 10 21 44 8 
Z1 10 22 45 10 

Есть простое решение этой проблемы ?

+2

Это похоже на работу для [панд] (http://pandas.pydata.org/). –

+0

Чем больше работы вы можете сделать? Если это действительно все, что вам нужно, решение @ r-phillip-castagna компактно; если вы, скорее всего, вложите немного больше работы, фермер-joe организовал его гибко; и если вы захотите сделать много изменений и анализа, панды - это путь. Решения, решения. – cphlewis

ответ

1

Прочитайте заголовок первого, затем инициализировать читателя, написать заголовок первого, затем инициализировать писатель:

import csv 

with open("in.csv", "rb") as in_file: 
    header = in_file.readline() 
    csv_file_in = csv.reader(in_file, delimiter=" ") 
    with open("out.csv","wb") as out_file: 
     out_file.write(header) 
     csv_file_out = csv.writer(out_file, delimiter=" ") 
     for row in csv_file_in: 
      csv_file_out.writerow([row[0], 10] + row[1:]) 
+0

Лучше использовать http://stackoverflow.com/a/29697977/102441, я думаю – Eric

+0

Спасибо :) Я думаю, что это самое близкое к правильному, которое я тестировал до сих пор, единственная проблема заключается в том, что в конце каждой строки в выходной файл я получаю ''. Как я могу избавиться от этого? – Marius

+0

Вы используете Windows, я полагаю? Посмотрите, исправляет ли это изменение, которое я сделал (чтение и запись в двоичном режиме). – L3viathan

3

Я думаю, что самым простым решением было бы просто прочитать каждую строку и написать соответствующую новую строку (с вставленным значением) в новом файле:

import csv 
with open('input.csv', 'r') as infile: 
    with open('output.csv', 'w') as outfile: 
     reader = csv.reader(infile, delimiter=' ') 
     writer = csv.writer(outfile, delimiter=' ') 
     for row in reader: 
      new_row = [row[0], 10] 
      new_row += row[1:] 
      writer.writerow(new_row) 

Это не могло бы иметь смысл, если вы не однако делать что-либо еще с данными, кроме этой массовой обработки. Вы бы захотели заглянуть в библиотеки csv, если это так.

1

Потяните данные в list, вставьте данные для каждой строки в нужное место и перепишите данные.

import csv 

data_to_add = 10  
new_column_index = 1 # 0 based index 

with open('FILE1.csv','r') as f: 
    csv_r = csv.reader(f,delimiter=' ') 
    data = [line for line in csv_r] 

for row in data: 
    row.insert(new_column_index,data_to_add) 

with open('FILE1.csv','w') as f: 
    csv_w = csv.writer(f,delimiter=' ') 
    for row in data: 
     csv_w.write(row) 
0

Вот как я мог бы сделать это с пандами:

import pandas as pd 

with open("in.csv") as input_file: 
    header = input_file.readline() 
    data = pd.read_csv(input_file, sep=" ") 

data.insert(1, "New Data", 10) 

with open("out.csv", "w") as output_file: 
    output_file.write(header) 
    data.to_csv(output_file, index=False, header=False) 
2

Используйте pandas, чтобы импортировать файл csv как имя DataFrame d df, а затем использовать df.insert(idx, col_name, value); где idx - это индекс только что созданного столбца, col_name - это имя, которое вы назначили этому столбцу, а value - это список значений, которые вы хотите присвоить столбцу. Смотрите ниже:

import pandas as pd 

prices = pd.read_csv('C:\\Users\\abdou.seck\\Documents\\prices.csv') 

prices 

## Output 
    Shares Number Prices 
0 AAP  100 100.67 
1 MSFT  50 56.50 
2 SAN  200 19.18 
3 GOOG  300 500.34 

prices.insert(3, 'Total', prices['Number']*prices['Prices']) 

prices 

## Output: 
    Shares Number Prices Total 
0 AAP  100 100.67 10067 
1 MSFT  50 56.50 2825 
2 SAN  200 19.18 3836 
3 GOOG  300 500.34 150102 

Надеюсь, это поможет.

Смежные вопросы