Словари и импорт CSV - PullRequest
       36

Словари и импорт CSV

0 голосов
/ 02 августа 2020

Я смотрел на принятый ответ:

Создание словаря из файла CSV

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

import csv reader = csv.DictReader(open('values.csv'))

result = {} for row in reader:
    for column, value in row.items():  # consider .iteritems() for Python 2
        result.setdefault(column, []).append(value)
        print(f"Column: {column}")
        print(f"Value: {value}") print(result)

Когда я запускаю этот код, я получаю:

Column: Date
Value: 123
Column: Foo
Value: 456
Column: Bar
Value: 789
Column: Date
Value: abc
Column: Foo
Value: def
Column: Bar
Value: ghi
{'Date': ['123', 'abc'], 'Foo': ['456', 'def'], 'Bar': ['789', 'ghi']}

для файла:

Date,Foo,Bar
123,456,789
abc,def,ghi

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

Что именно делает column, value in row.items()? Означает ли это, что для каждого столбца в строке (разделенного запятой) считать это значением? Что делает .items() (я просмотрел документацию, но не понял, что Returns a list containing a tuple for each key value pair meant)?

Кроме того, что делает result.setdefault(column, []).append(value)? Я знаю, что добавление добавляет значение, но что означает синтаксис .setdefault(column, []) (в документации это означает Returns the value of the specified key. If the key does not exist: insert the key, with the specified value, чего я тоже не понимаю)?

Кроме того, как программа поняла, что первая строка - это та, в которой я хочу сохранить ключи?

Я никогда раньше не делал Python, поэтому прошу прощения, если это глупый вопрос! Я просто хочу создать словарь для базы данных, и это кажется идеальным вариантом, но я хочу знать, что делает каждая строка. Заранее спасибо!

1 Ответ

0 голосов
/ 02 августа 2020

1. Что именно делает column, value в row.items ()?

Чтобы ответить на этот вопрос, мы должны взглянуть на строку reader = csv.DictReader(open('values.csv')). A DictReader возвращает строки CSV в качестве словаря, где ключи (по умолчанию) такие же, как первая строка в вашем файле CSV (например, имена столбцов). При итерации по читателю (for row in reader:) row является словарем. Чтобы получить пары ключ / значение из словаря, вы должны вызвать его метод .items(), который возвращает итератор кортежей, содержащих ключ и значение соответственно. В вашем случае, если мы прочитаем вторую строку вашего образца CSV, строка будет идентична:

row = {
   "Date": 123, 
   "Foo": 456, 
   "Bar": 789
}

Итак, в вашей первой итерации for column, value in row.items(): мы присваиваем значение "Date" column и от 123 до value. Мы можем что-то сделать с этими значениями, и в следующей итерации для l oop (так что следующий кортеж, который создается row.items ()), значение "Foo" присваивается column и 456 на value.

2. Кроме того, что делает result.setdefault (column, []). Append (value)?

Обратите внимание, что переменная result - это пустой словарь. Этот словарь будет содержать списки значений, мы хотим, чтобы переменная result выглядела следующим образом:

result = {
   "Date": [123, "abc"],
   "Foo": [456, "def"],
   "Bar": [789, "ghi"]
}

В for-l oop, в котором мы находимся (цикл по row словарь), теперь мы присваиваем значение 123 ключу "Date" в словаре result. Однако, если мы находимся на первой итерации, словарь result все еще пуст! В основном здесь происходит следующее: result.setdefault(column, []) -> this получает значение ключа column (обратите внимание, это переменная из for-l oop!) Из словаря с именем result, и если этот ключ не существует, создайте его с пустым списком и верните это значение (пустой список). В этом случае [] - пустой список. На первой итерации (где ключи / значения не хранятся в словаре result) переменной column присваивается «Дата», и, поскольку она еще не существует в словаре result, она создается с помощью value [] (пустой список).

Затем в цепочке вы вызываете .append(value), который принимает значение (в первой итерации это 123) и добавляет его в список.

3. Кроме того, как программа поняла, что первая строка - это та, в которой я хочу сохранить ключи?

Это уловка DictReader, которая по умолчанию смотрит на вашу первую строку CSV и обрабатывает его как имена столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...