Чтение заголовка CSV-файла и проверка его соответствия ключу словаря, а затем запись значения этого ключа в строку - PullRequest
0 голосов
/ 28 ноября 2018

Обычно у меня будет небольшой словарь, например:

dictionary_list = [
{"eight": "yes", "queen": "yes", "we": "yes", "eighteen": "yes"},
{"nine": "yes", "king": "yes","we": "yes", "nineteen": "yes"}
]

Затем у меня есть CSV-файл с целой кучей столбцов со словами в заголовке, например: enter image description here Может быть 500 столбцов в каждом по 1 слову, и я не знаю, в каком порядке появляется столбец.Однако я знаю, что любое слово в моем небольшом словаре должно соответствовать слову в столбце.

Я хочу перебирать заголовки файла (пропуская сначала до 5 заголовков столбцов) и каждый разпосмотрите, можно ли найти имя заголовка в словаре, и если да, добавьте значение в эту строку, если нет, добавьте «нет».Это будет сделано строка за строкой, где каждая строка для одного из небольших словарей.Результаты с использованием приведенного выше словаря для этого файла:
enter image description here

До сих пор я мог попробовать следующее, что на самом деле не работает:

f = open("file.csv", "r")
writer = csv.DictWriter(f)
for dict in dictionary_list: # this is the collection of little dictionaries
    # do some other stuff
    for r in writer: 
        #not sure how to skip 10 columns here. next() seems to work on rows 
        for col in r:
            if col in dict.keys():
                 writer.writerow(dict.values())
             else:
                 writer.writerow("no")

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Ваш вопрос, по-видимому, требует, чтобы поля из вашего словаря_списка существовали в записи.Если поле изначально существовало в записи, установите значение поля в «да», в противном случае добавьте поле в запись и установите значение «нет».

#!/usr/bin/env python3

import csv


dictionary_list = [
    {"eight": "yes", "queen": "yes", "we": "yes", "eighteen": "yes"},
    {"nine": "yes", "king": "yes","them": "yes", "nineteen": "yes"}
]

"""
flatten all the dicionary keys into a uniq list as the
key names will be used for field names and can't be duplicated
"""
field_check = set([k for d in dictionary_list for k in d.keys()])

if __name__ == "__main__":

    with open("file.csv", "r") as f:
        reader = csv.DictReader(f)

        # do not consider the first 10 colums
        field_tail = set(reader.fieldnames[10:])

        """
        initialize yes and no fields as they
        should be the same for every row in the file
        """
        yes_fields = set(field_check & field_tail)
        no_fields = field_check.difference(yes_fields)
        yes_dict = {k:"yes" for k in yes_fields}
        no_dict = {k:"no" for k in no_fields}
        for row in reader:
            row.update(yes_dict)
            row.update(no_dict)
            print(row)
0 голосов
/ 28 ноября 2018

С учетом входного файла headers.csv:

row1,row2,row3,row4,row5,bad,good,eight,nine,queen,three,eighteen,nineteen,king,jack,ace,we,them,you,two

Ваш код генерирует следующий код:

import csv

dictionary_list = [{"eight": "yes", "queen": "yes", "we": "yes", "eighteen": "yes"},
                   {"nine": "yes", "king": "yes","we": "yes", "nineteen": "yes"}]

# Read the input header line as a list
with open('headers.csv',newline='') as f:
    reader = csv.reader(f)
    headers = next(reader)

# Generate the fixed values for the first 5 rows.
rowvals = dict(zip(headers[:5],['x'] * 5))

with open('file.csv', 'w', newline='') as f:
    # When writing a row, restval is the default value when it isn't in the dict row.
    # extrasaction='ignore' prevents complaining if all columns are not present in dict row.
    writer = csv.DictWriter(f,headers,restval='no',extrasaction='ignore')
    writer.writeheader()
    for dictionary in dictionary_list:
        D = dictionary.copy() # needed if the original shouldn't be modified.
        D.update(rowvals)
        writer.writerow(D)

Вывод:

row1,row2,row3,row4,row5,bad,good,eight,nine,queen,three,eighteen,nineteen,king,jack,ace,we,them,you,two
x,x,x,x,x,no,no,yes,no,yes,no,yes,no,no,no,no,yes,no,no,no
x,x,x,x,x,no,no,no,yes,no,no,no,yes,yes,no,no,yes,no,no,no
0 голосов
/ 28 ноября 2018

«Панды» могут вам помочь.

Вот веб-сайт http://pandas.pydata.org/pandas-docs/stable/.

Вы можете обработать CSV-файл, используя метод pandas.read_csv(), и добавить некоторые данные, как вы хотите, используя Dataframe.append() метод.

Надеюсь, это будет полезно для вас.

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