Вывести вложенный массив переменной длины в CSV - PullRequest
0 голосов
/ 18 января 2019

У меня есть образец данных, который я хотел бы вывести в файл CSV. Структура данных представляет собой вложенный список различных немецких терминов (dict) и соответствующих возможных английских переводов (list):

all_terms = [{'Motor': ['engine', 'motor']},
             {'Ziel': ['purpose', 'goal', 'aim', 'destination']}]

Как видите, один немецкий термин может содержать переменные количества английских переводов. Я хочу вывести каждый немецкий термин и каждый из его соответствующих переводов в отдельные столбцы в одной строке, поэтому "Motor" находится в столбце 1, "engine" в столбце 2 и "motor" в столбце 3.

См. Пример: Table

Я просто не знаю, как правильно перебирать данные. Пока что мой код для вывода:

with open(filename, 'a') as csv_file:
    writer = csv.writer(csv_file)
    # The for loop
    for x in all_terms:
        for i in x:
            for num in i:
                writer.writerow([i, x[i][num]])

Но эта ошибка выбрасывается:

writer.writerow([i, x[i][num]]) TypeError: list indices must be integers, not unicode

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

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Вот способ сделать это:

import csv


all_terms = [{'Motor': ['engine', 'motor']},
             {'Ziel': ['purpose', 'goal', 'aim', 'destination']}]

filename = 'tranlations.csv'

with open(filename, 'a', newline='') as csv_file:
    writer = csv.writer(csv_file)

    for term in all_terms:
        word, translations = term.popitem()
        row = [word] + translations
        writer.writerow(row)

Содержимое файла CSV впоследствии:

Motor,engine,motor
Ziel,purpose,goal,aim,destination
0 голосов
/ 18 января 2019

Как насчет следующего решения:

import csv

all_terms = [{'Motor': ['engine', 'motor']},
             {'Ziel': ['purpose', 'goal', 'aim', 'destination']}]

with open('test.csv', 'a') as csv_file:
    writer = csv.writer(csv_file)
    # The for loop
    for small_dict in all_terms:
        for key in small_dict:
            output = [key, *small_dict[key]]              
            writer.writerow(output)

Вывод в test.txt:

Motor,engine,motor
Ziel,purpose,goal,aim,destination

Я использовал оператор *, чтобы распаковать все элементы внутри значений словаря, чтобы создать строку для записи writerow. Это потенциально может помочь в случае, если у вас есть несколько записей в словаре внутри all_terms.

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