Я пытаюсь разобрать файл 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
.
Код, на который я посмотрел, заставил меня поверить, что я могу вызвать конкретный столбец по соответствующему номеру, то есть: 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
и я ожидаю, что при этом будут напечатаны только те столбцы, которые мне нужны для каждой строки, кроме случаев, когда я получаю только последний столбец.
'rb'
флагopen()
? не должно ли быть простоr
?"rb"
подходит для перехода наcsv.reader
.Ответы:
Единственный способ получить последний столбец из этого кода - это если вы не включите оператор print в свой
for
цикл.Это, скорее всего, конец вашего кода:
Вы хотите, чтобы это было так:
Теперь, когда мы рассмотрели вашу ошибку, я хотел бы воспользоваться этим временем, чтобы познакомить вас с модулем панд .
Pandas отлично подходит для работы с CSV-файлами, и следующий код будет всем, что вам нужно, чтобы прочитать CSV-файл и сохранить весь столбец в переменную:
поэтому, если вы хотите сохранить всю информацию в столбце
Names
в переменную, это все, что вам нужно сделать:Это отличный модуль, и я предлагаю вам изучить его. Если по какой-то причине ваше заявление на печать было в
for
цикле, и оно все еще только печатало последний столбец, чего не должно быть, но дайте мне знать, если мое предположение было неверным. В вашем опубликованном коде много ошибок отступов, поэтому было трудно понять, что и где должно было быть. Надеюсь, это было полезно!источник
С файлом вроде
Будет выходной
Или в качестве альтернативы, если вы хотите числовую индексацию для столбцов:
Для изменения разделителя добавьте
delimiter=" "
соответствующий экземпляр, т.е.reader = csv.reader(f,delimiter=" ")
источник
Используйте панд :
Откажитесь от ненужных столбцов во время разбора:
PS Я просто обобщаю то, что сказали другие, в простой форме. Актуальные ответы принимаются здесь и здесь .
источник
С пандами вы можете использовать
read_csv
сusecols
параметром:Пример:
источник
Вы можете использовать
numpy.loadtext(filename)
. Например, если это ваша база данных.csv
:И вы хотите
Name
столбец:Более легко вы можете использовать
genfromtext
:источник
Контекст: Для этого типа работы вы должны использовать удивительную библиотеку Python Petl. Это избавит вас от большой работы и потенциального разочарования от выполнения действий «вручную» со стандартным модулем CSV. AFAIK, единственные люди, которые все еще используют модуль csv, - это те, кто еще не обнаружил лучших инструментов для работы с табличными данными (pandas, petl и т. Д.), Что хорошо, но если вы планируете работать с большим количеством данных в Ваша карьера из разных странных источников, изучение чего-то вроде petl - одна из лучших инвестиций, которую вы можете сделать. Чтобы начать, нужно только через 30 минут после того, как вы сделали pip install petl. Документация отличная.
Ответ: Допустим, у вас есть первая таблица в CSV-файле (вы также можете загрузить напрямую из базы данных, используя petl). Тогда вы просто загрузите его и сделаете следующее.
источник
Я думаю, что есть более простой способ
Так вот
iloc[:, 0]
,:
значит , все значения,0
означает положение колонны. в примере нижеID
будет выбранисточник
источник
pip install pandas
сначалаБлагодаря тому, что вы можете индексировать и размещать подгруппу данных pandas, очень простой способ извлечь один столбец из файла csv в переменную:
Несколько вещей для рассмотрения:
Фрагмент выше будет производить панды,
Series
а неdataframe
. Предложение от айхана сusecols
также будет быстрее, если скорость является проблемой. Тестирование двух разных подходов с использованием%timeit
csv-файла размером 2122 КБ приводит22.8 ms
к подходу usecols и53 ms
к моему предложенному подходу.И не забывай
import pandas as pd
источник
Если вам нужно обрабатывать столбцы по отдельности, мне нравится деструктурировать столбцы с помощью
zip(*iterable)
шаблона (эффективно «разархивировать»). Итак, для вашего примера:источник
Получить имя столбца вместо использования readlines () лучше использовать readline (), чтобы избежать зацикливания, чтения всего файла и сохранения его в массиве.
источник