Как исключить столбцы в csv DictReader, используя Python? - PullRequest
0 голосов
/ 08 октября 2018

Я действительно хочу прочитать следующий CSV-файл: ID;Имя;Фамилия;Телефон;123;Максимум;Смит;0193849843 124;Джон;Doe;0012943843

.. и извлеките его в следующем формате:

[OrderedDict ([('ID', '123'), ('Фамилия', 'Смит')]),OrderedDict ([('ID', '124'), ("Last Name", "Doe")])]

Однако, с моим кодом, показанным ниже, я могу получить OrderedDict только со всеми ключамивнутри.Как можно получить доступ только к определенным столбцам в файле CSV?Мне нужен точный вывод, чтобы потом преобразовать код в JSON.

import csv

csvfilepath = r"csvpath"
jsonfilepath = r"jsonpath"

data = []

with open(csvfilepath) as csvfile:
    csvReader = csv.DictReader(csvfile,delimiter=";")

    for csvRow in csvReader:
        ID = csvRow["ID"]
        data.append(csvRow) 

Большое спасибо!Jonas

1 Ответ

0 голосов
/ 08 октября 2018

Краткий ответ: да , вы можете прочитать определенные столбцы (но с оговоркой).Однако будет намного проще, если вы просто прочитаете все столбцы, а затем создадите словарь из нужных вам столбцов.Это намного проще и может даже работать лучше.


Вы можете использовать аргумент fieldnames, чтобы явно определить интересующие вас столбцы. Предостережение заключается в том, что другие столбцы будут по-прежнемуприсутствовать в словаре под ключом None (если вы не укажете другой ключ с аргументом restkey).

Из документов :

Параметр fieldnames является последовательностью.Если fieldnames опущен, значения в первой строке файла f будут использоваться как fieldnames.Независимо от того, как определяется fieldnames, упорядоченный словарь сохраняет свое первоначальное упорядочение.

Если строка содержит больше полей, чем fieldnames, оставшиеся данные помещаются в список и сохраняются с именем поля, заданным параметромrestkey (по умолчанию None).Если в непустой строке меньше полей, чем fieldnames, пропущенные значения заполняются None.

. Вы можете использовать fieldnames, чтобы указать нужные столбцы, а затем использовать.pop для удаления ключа None (и его значений).

Рассмотрим следующий файл:

header1,header2
a,b
c,d
e,f

Тогда:

with open('test.csv') as csvfile:
    csvReader = csv.DictReader(csvfile, fieldnames=['header1'])
    print([row for row in csvReader])
    # [OrderedDict([('header1', 'header1'), (None, ['header2'])]),
    #  OrderedDict([('header1', 'a'), (None, ['b'])]),
    #  OrderedDict([('header1', 'c'), (None, ['d'])]), 
    #  OrderedDict([('header1', 'e'), (None, ['f'])])]

Если мы выскакиваемNone ключ:

csvReader = list(csvReader)
[row.pop(None) for row in csvReader]
# yes, abusing list comprehension for a side effect for sake of a simple example.
# Don't do that in production code
print([row for row in csvReader])
# [OrderedDict([('header1', 'header1')]), OrderedDict([('header1', 'a')]),
#  OrderedDict([('header1', 'c')]), OrderedDict([('header1', 'e')])]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...