Как удалить столбцы в файле CSV? - PullRequest
24 голосов
/ 29 сентября 2011

Мне удалось создать CSV с Python, используя вход от нескольких пользователей на этом сайте, и я хочу выразить свою благодарность за ваши сообщения. Сейчас я в тупике и опубликую свой первый вопрос.

Мой input.csv выглядит так:

day,month,year,lat,long
01,04,2001,45.00,120.00
02,04,2003,44.00,118.00

Я пытаюсь удалить столбец "год" и все его записи. Всего более 1960 записей с диапазоном лет от 1960-2010.

Ответы [ 8 ]

42 голосов
/ 29 сентября 2011
import csv
with open("source","rb") as source:
    rdr= csv.reader( source )
    with open("result","wb") as result:
        wtr= csv.writer( result )
        for r in rdr:
            wtr.writerow( (r[0], r[1], r[3], r[4]) )

Кстати, петля for может быть удалена, но на самом деле не упрощена.

        in_iter= ( (r[0], r[1], r[3], r[4]) for r in rdr )
        wtr.writerows( in_iter )

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

            del r[2]
            wtr.writerow( r )
25 голосов
/ 24 декабря 2015

Использование модуля Pandas будет намного проще.

import pandas as pd
f=pd.read_csv("test.csv")
keep_col = ['day','month','lat','long']
new_f = f[keep_col]
new_f.to_csv("newFile.csv", index=False)

А вот краткое объяснение:

>>>f=pd.read_csv("test.csv")
>>> f
   day  month  year  lat  long
0    1      4  2001   45   120
1    2      4  2003   44   118
>>> keep_col = ['day','month','lat','long'] 
>>> f[keep_col]
    day  month  lat  long
0    1      4   45   120
1    2      4   44   118
>>>
7 голосов
/ 16 ноября 2012

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

import csv
ct = 0
cols_i_want = {'cost' : -1, 'date' : -1}
with open("file1.csv","rb") as source:
    rdr = csv.reader( source )
    with open("result","wb") as result:
        wtr = csv.writer( result )
        for row in rdr:
            if ct == 0:
              cc = 0
              for col in row:
                for ciw in cols_i_want: 
                  if col == ciw:
                    cols_i_want[ciw] = cc
                cc += 1
            wtr.writerow( (row[cols_i_want['cost']], row[cols_i_want['date']]) )
            ct += 1
1 голос
/ 28 марта 2016

Вы можете напрямую удалить столбец с помощью

del variable_name['year']
1 голос
/ 29 сентября 2011

Вне моей головы, это сделает это без какой-либо проверки ошибок или возможности что-либо настраивать.То есть «оставлено читателю».

outFile = open( 'newFile', 'w' )
for line in open( 'oldFile' ):
   items = line.split( ',' )
   outFile.write( ','.join( items[:2] + items[ 3: ] ) )
outFile.close()
1 голос
/ 29 сентября 2011

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

Приведенный ниже пример не протестирован и должен иллюстрировать решение:

import csv

file_name = 'C:\Temp\my_file.csv'
output_file = 'C:\Temp\new_file.csv'
csv_file = open(file_name, 'r')
## note that the index of the year column is excluded
column_indices = [0,1,3,4]
with open(output_file, 'w') as fh:
    reader = csv.reader(csv_file, delimiter=',')
    for row in reader:
       tmp_row = []
       for col_inx in column_indices:
           tmp_row.append(row[col_inx])
       fh.write(','.join(tmp_row))
0 голосов
/ 30 апреля 2019

Попробуйте:

result= data.drop('year', 1)
result.head(5)
0 голосов
/ 29 сентября 2011

Это зависит от того, как вы храните проанализированный CSV, но обычно вам нужен оператор del.

Если у вас есть массив диктов:

input = [ {'day':01, 'month':04, 'year':2001, ...}, ... ]
for E in input: del E['year']

Если у вас есть массив массивов:

input = [ [01, 04, 2001, ...],
          [...],
          ...
        ]
for E in input: del E[2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...