Читать определенные столбцы из файла csv с модулем csv?
Я пытаюсь разобрать csv-файл и извлечь данные только из определенных столбцов.
пример csv-файла:
ID | Name | Address | City | State | Zip | Phone | OPEID | IPEDS |
10 | C... | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |
Я пытаюсь захватить только определенные столбцы, скажем ID,Name,Zip и Phone.
код, который я посмотрел, заставил меня поверить, что я могу вызвать конкретный столбец по его соответствующему номеру, поэтому ie:Name будет соответствовать 2 и итерации через каждую строку с помощью row[2] произведет все детали внутри столбец 2. Только это не так.
вот что я сделал до сих пор:
import sys, argparse, csv
from settings import *
# command arguments
parser = argparse.ArgumentParser(description='csv to postgres',
fromfile_prefix_chars="@" )
parser.add_argument('file', help='csv file to import', action='store')
args = parser.parse_args()
csv_file = args.file
# open csv file
with open(csv_file, 'rb') as csvfile:
# get number of columns
for line in csvfile.readlines():
array = line.split(',')
first_item = array[0]
num_columns = len(array)
csvfile.seek(0)
reader = csv.reader(csvfile, delimiter=' ')
included_cols = [1, 2, 6, 7]
for row in reader:
content = list(row[i] for i in included_cols)
print content
и я ожидаю, что это будет печатать только определенные столбцы, которые я хочу для каждой строки, за исключением того, что это не так, я получаю только последний столбец.
7 ответов:
единственный способ получить последний столбец из этого кода-это если вы не включаете свой оператор печати на код
forпетли.это скорее всего конец вашего кода:
for row in reader: content = list(row[i] for i in included_cols) print contentвы хотите, чтобы это было так:
for row in reader: content = list(row[i] for i in included_cols) print contentтеперь, когда мы рассмотрели Вашу ошибку, я хотел бы воспользоваться этим временем, чтобы представить вам панды модуль.
панды является впечатляющим для работы с файлами csv, и следующий код будет все, что вам нужно прочитать CSV и сохранить весь столбец в переменную:
import pandas as pd df = pd.read_csv(csv_file) saved_column = df.column_name #you can also use df['column_name']так что если вы хотите сохранить всю информацию в вашей колонке
Namesв переменную, это все, что вам нужно сделать:names = df.Namesэто отличный модуль, и я предлагаю вам взглянуть на это. Если по какой-то причине ваш оператор печати был в
forцикл, и он все еще только распечатывал последний столбец, чего не должно было произойти, но дайте мне знать, если мое предположение было неверным. Ваш опубликованный код имеет много ошибок отступа, поэтому было трудно узнать, что должно быть там. Надеюсь, это было полезно!
import csv from collections import defaultdict columns = defaultdict(list) # each value in each column is appended to a list with open('file.txt') as f: reader = csv.DictReader(f) # read rows into a dictionary format for row in reader: # read a row as {column1: value1, column2: value2,...} for (k,v) in row.items(): # go over each column name and value columns[k].append(v) # append the value into the appropriate list # based on column name k print(columns['name']) print(columns['phone']) print(columns['street'])с файлом типа
name,phone,street Bob,0893,32 Silly James,000,400 McHilly Smithers,4442,23 Looped St.выводит
>>> ['Bob', 'James', 'Smithers'] ['0893', '000', '4442'] ['32 Silly', '400 McHilly', '23 Looped St.']или альтернативно, если вы хотите числовую индексацию для столбцов:
with open('file.txt') as f: reader = csv.reader(f) reader.next() for row in reader: for (i,v) in enumerate(row): columns[i].append(v) print(columns[0]) >>> ['Bob', 'James', 'Smithers']чтобы изменить разделитель добавить
delimiter=" "к соответствующему экземпляру, т. е.reader = csv.reader(f,delimiter=" ")
можно использовать
numpy.loadtext(filename). Например, если это ваша база данных.csv:ID | Name | Address | City | State | Zip | Phone | OPEID | IPEDS | 10 | Adam | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 | 10 | Carl | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 | 10 | Adolf | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 | 10 | Den | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |и вы хотите, чтобы
использовать панды:
import pandas as pd my_csv = pd.read_csv(filename) column = my_csv.column_name # you can also use my_csv['column_name']немного больше памяти-удобное решение, если вам действительно нужны эти байты (выбрасывает ненужные столбцы во время разбора):
my_filtered_csv = pd.read_csv(filename, usecols=['col1', 'col3', 'col7'])P. S. Я просто агрегирования, что другие сказали в простой форме. Фактические ответы взяты из здесь и здесь.
контекст: для этого типа работы вы должны использовать удивительную библиотеку python petl. Это сэкономит вам много работы и потенциального разочарования от выполнения вещей "вручную" со стандартным модулем csv. AFAIK, единственные люди, которые все еще используют модуль csv, - это те, кто еще не обнаружил лучших инструментов для работы с табличными данными (панды, petl и т. д.), что хорошо, но если вы планируете работать с большим количеством данных в своей карьере из различных странных источников, изучая что-то вроде petl один из лучших инвестиций вы можете сделать. Для начала должно занять всего 30 минут после того, как вы сделали pip install petl. Документация отличная.
ответ: допустим, у вас есть первая таблица в csv-файле (вы также можете загрузить непосредственно из базы данных с помощью petl). Потом вы просто загрузите его и выполните следующие действия.
from petl import fromcsv, look, cut, tocsv #Load the table table1 = fromcsv('table1.csv') # Alter the colums table2 = cut(table1, 'Song_Name','Artist_ID') #have a quick look to make sure things are ok. Prints a nicely formatted table to your console print look(table2) # Save to new file tocsv(table2, 'new.csv')
, чтобы забрать имя столбца, вместо readlines() лучше использовать readline () чтобы избежать цикла и чтения полного файла и хранения его в массиве.
with open(csv_file, 'rb') as csvfile: # get number of columns line = csvfile.readline() first_item = line.split(',')
Comments