Как записать файл в определенном формате в файл - PullRequest
0 голосов
/ 21 декабря 2018

Предположим, у меня есть несколько списков диктов, что-то вроде

list_one = [{'genre': 'Action', 'amount': 141, 'meanScore': 82}, {'genre': 'Comedy', 'amount': 191, 'meanScore': 82}]

list_two = [{'genre': 'Horror', 'amount': 11, 'meanScore': 62}, {'genre': 'Comedy', 'amount': 191, 'meanScore': 82}]

Моя цель - записать это в файл в форме

           Action       Comedy       Horror      
list_one  meanScore   meanScore    
           amount       amount       
list_two              meanScore     meanScore
                        amount       amount

Я недействительно хорошо знаком с dict и тем, как лучше всего их хранить, но кажется, что csv-файлы довольно популярны для этого.Я попытался использовать этот ответ здесь , чтобы решить мою проблему, но мне трудно понять, что делает @MarkLongair и как вы расширили бы это до моей проблемы.Одна из главных вещей, которые меня беспокоят, это то, что не каждый жанр является частью каждого списка, поэтому я не знаю, как проверить в существующем файле CSV, существует ли ключ, где он находится и как записать значение вправая колонка

Поскольку я не мог по-настоящему понять связанный ответ, я попробовал что-то вроде

from pandas import DataFrame

list_one = [{'genre': 'Action', 'amount': 141, 'meanScore': 82},
            {'genre': 'Comedy', 'amount': 191, 'meanScore': 82}]

list_two = [{'genre': 'Horror', 'amount': 11, 'meanScore': 62}, 
            {'genre': 'Comedy', 'amount': 191, 'meanScore': 82}]

DataFrame(list_one).to_csv('test.csv')
DataFrame(list_two).to_csv('test.csv')

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

Я не уверен, как перейти к форме здесь или каково правильное направление ... Может кто-нибудь может немного помочь?

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Один из способов обойти это без использования Pandas [РЕДАКТИРОВАТЬ: я вижу, что вы с тех пор редактировали, чтобы упомянуть об этом], это сделать функцию, которая просматривает один из ваших словарей и составляет соответствующую строку текста CSV.

def generate_row(separator, headers, data_type, data_list, list_name):
    data_by_genre = {k: '' for k in headers}
    for data in data_list:
        data_by_genre[data['genre']] = str(data[data_type])

    output_text = separator.join([data_by_genre[genre] for genre in headers]) + '\n'
    # If it's 'amount', then the row starts with the name. Otherwise that space is blank.
    if data_type == 'amount':
        output_text = list_name + output_text

    return output_text


list_one = [{'genre': 'Action', 'amount': 141, 'meanScore': 82}, {'genre': 'Comedy', 'amount': 191, 'meanScore': 82}]
list_two = [{'genre': 'Horror', 'amount': 11, 'meanScore': 62}, {'genre': 'Comedy', 'amount': 191, 'meanScore': 82}]

headers = ['', 'Action', 'Comedy', 'Horror']
separator = ','

f = open('new.csv', 'w')
f.write(separator.join(headers))
f.write('\n')
f.write(generate_row(separator, headers, 'amount', list_one, 'list_one'))
f.write(generate_row(separator, headers, 'meanScore', list_one, 'list_one'))
f.write(generate_row(separator, headers, 'amount', list_two, 'list_two'))
f.write(generate_row(separator, headers, 'meanScore', list_two, 'list_two'))
f.close()

Я сделал «разделитель» переменной, если вы хотите использовать, например, разделенные табуляцией вместо запятых.

Если вы хотите использовать Pandas, вы можете написать что-нибудь, чтобы переформатировать ваши данныевыглядеть так, поэтому пишет "правильно".

data1 = [{'Action': 141, 'Comedy': 191, 'Horror': None},
         {'Action': 82, 'Comedy': 82, 'Horror': None},
         {'Action': None, 'Comedy': 191, 'Horror': 11},
         {'Action': None, 'Comedy': 82, 'Horror': 62}]

DataFrame(data1).to_csv('test.csv')
0 голосов
/ 21 декабря 2018

В первой версии вашего вопроса вы не упоминали, что работаете в pandas, которая действительно отличается от стандартных библиотек Python и важной информации.Панды на самом деле не нужны для этого, но я предполагаю, что вы используете панды по другим причинам.

DataFrame(list1 + list2).to_csv('test.csv')

См. Также

Как добавить данные панд в существующий CSV-файл?

, если вы хотите добавить во время записи, а скорее объединить списки, прежде чем превратиться в фрейм данных.

Другими решениями, кроме панд, будут csv.DictWriter в библиотеке csv или сериализация JSON (еслиCSV не является обязательным требованием).

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