Чтение только имен столбцов в файле csv

У меня есть файл csv со следующими столбцами:

идентификатор, имя, возраст, пол

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

Я использую Dictreader, и это дает правильные данные:

with open('details.csv') as csvfile:
    i=["name","age","sex"]
    re=csv.DictReader(csvfile)
    for row in re:
        for x in i:
            print row[x]

Но то, что я хочу сделать, - мне нужен список столбцов ( "i" в приведенном выше случае), который автоматически анализируется с помощью ввода csv, чем hardcoding их внутри списка.

with open('details.csv') as csvfile:

    rows=iter(csv.reader(csvfile)).next()
    header=rows[1:]
    re=csv.DictReader(csvfile)
    for row in re:
        print row
        for x in header:

            print row[x]

Выдает ошибку

Keyerrror:'name'

в строке строки печати [x]. Где я иду не так? Можно ли получить имена столбцов с помощью Dictreader? Незлая помощь. Спасибо и приветствую.

Ответ 1

Вы можете прочитать заголовок, используя функцию next(), которая возвращает следующую строку итеративного объекта readers как список. то вы можете добавить содержимое файла в список.

import csv
with open("C:/path/to/.filecsv", "rb") as f:
    reader = csv.reader(f)
    i = reader.next()
    rest = [row for row in reader]

Теперь у меня есть имена столбцов в виде списка.

print i
>>>['id', 'name', 'age', 'sex']

Также обратите внимание, что reader.next() не работает в python 3. Вместо этого используйте встроенный next(), чтобы получить первую строку csv сразу после прочтения так:

import csv
with open("C:/path/to/.filecsv", "rb") as f:
    reader = csv.reader(f)
    i = next(reader)

    print(i)
    >>>['id', 'name', 'age', 'sex']

Ответ 2

Хотя у вас уже есть принятый ответ, я подумал, что добавлю это для всех, кто интересуется другим решением -

Реализация может быть следующей:

import csv

with open('C:/mypath/to/csvfile.csv', 'r') as f:
    d_reader = csv.DictReader(f)

    #get fieldnames from DictReader object and store in list
    headers = d_reader.fieldnames

    for line in d_reader:
        #print value in MyCol1 for each row
        print(line['MyCol1'])

В приведенном выше примере d_reader.fieldnames возвращает список ваших заголовков (при условии, что заголовки находятся в верхней строке). Что позволяет...

>>> print(headers)
['MyCol1', 'MyCol2', 'MyCol3']

Если ваши заголовки включены, скажите 2-ю строку (с самой верхней строкой, являющейся строкой 1), вы можете сделать следующее:

import csv

with open('C:/mypath/to/csvfile.csv', 'r') as f:
    #you can eat the first line before creating DictReader.
    #if no "fieldnames" param is passed into
    #DictReader object upon creation, DictReader
    #will read the upper-most line as the headers
    f.readline()

    d_reader = csv.DictReader(f)
    headers = d_reader.fieldnames

    for line in d_reader:
        #print value in MyCol1 for each row
        print(line['MyCol1'])

Ответ 3

csv.DictReader объект выставляет атрибут fieldnames, и это то, что вы будете использовать. Здесь пример кода, за которым следует вход и соответствующий вывод:

import csv
file = "/path/to/file.csv"
with open(file, mode='r', encoding='utf-8') as f:
    reader = csv.DictReader(f, delimiter=',')
    for row in reader:
        print([col + '=' + row[col] for col in reader.fieldnames])

Содержимое входного файла:

col0,col1,col2,col3,col4,col5,col6,col7,col8,col9
00,01,02,03,04,05,06,07,08,09
10,11,12,13,14,15,16,17,18,19
20,21,22,23,24,25,26,27,28,29
30,31,32,33,34,35,36,37,38,39
40,41,42,43,44,45,46,47,48,49
50,51,52,53,54,55,56,57,58,59
60,61,62,63,64,65,66,67,68,69
70,71,72,73,74,75,76,77,78,79
80,81,82,83,84,85,86,87,88,89
90,91,92,93,94,95,96,97,98,99

Вывод заявлений печати:

['col0=00', 'col1=01', 'col2=02', 'col3=03', 'col4=04', 'col5=05', 'col6=06', 'col7=07', 'col8=08', 'col9=09']
['col0=10', 'col1=11', 'col2=12', 'col3=13', 'col4=14', 'col5=15', 'col6=16', 'col7=17', 'col8=18', 'col9=19']
['col0=20', 'col1=21', 'col2=22', 'col3=23', 'col4=24', 'col5=25', 'col6=26', 'col7=27', 'col8=28', 'col9=29']
['col0=30', 'col1=31', 'col2=32', 'col3=33', 'col4=34', 'col5=35', 'col6=36', 'col7=37', 'col8=38', 'col9=39']
['col0=40', 'col1=41', 'col2=42', 'col3=43', 'col4=44', 'col5=45', 'col6=46', 'col7=47', 'col8=48', 'col9=49']
['col0=50', 'col1=51', 'col2=52', 'col3=53', 'col4=54', 'col5=55', 'col6=56', 'col7=57', 'col8=58', 'col9=59']
['col0=60', 'col1=61', 'col2=62', 'col3=63', 'col4=64', 'col5=65', 'col6=66', 'col7=67', 'col8=68', 'col9=69']
['col0=70', 'col1=71', 'col2=72', 'col3=73', 'col4=74', 'col5=75', 'col6=76', 'col7=77', 'col8=78', 'col9=79']
['col0=80', 'col1=81', 'col2=82', 'col3=83', 'col4=84', 'col5=85', 'col6=86', 'col7=87', 'col8=88', 'col9=89']
['col0=90', 'col1=91', 'col2=92', 'col3=93', 'col4=94', 'col5=95', 'col6=96', 'col7=97', 'col8=98', 'col9=99']

Ответ 4

Поблагодарив Даниэля Хименеса за его идеальное решение для извлечения имен столбцов только из моего csv, я расширяю его решение для использования DictReader, поэтому мы можем перебирать строки, используя имена столбцов в качестве индексов. Спасибо, Хименес.

with open('myfile.csv') as csvfile:

    rest = []
    with open("myfile.csv", "rb") as f:
        reader = csv.reader(f)
        i = reader.next()
        i=i[1:]
        re=csv.DictReader(csvfile)
        for row in re:
            for x in i:
                print row[x]

Ответ 5

Я просто упоминаю, как получить все имена столбцов из файла csv. Я использую библиотеку pandas.

Сначала мы читаем файл.

import pandas as pd
file = pd.read_csv('details.csv')

Затем, чтобы просто получить все имена столбцов в виде списка из входного файла, используйте: -

columns = list(file.head(0))

Ответ 6

вот код для печати только заголовков или столбцов файла csv.

import csv
HEADERS = next(csv.reader(open('filepath.csv')))
print (HEADERS)

Другой метод с пандами

import pandas as pd
HEADERS = list(pd.read_csv('filepath.csv').head(0))
print (HEADERS)