Запись пар ключ:значение в файл с разделителями табуляцией с переменными #s значений

Вопрос для начинающих: у меня есть словарь, в котором значения представляют собой списки (переменная #) строк. В конечном счете, я хотел бы записать каждую словарную запись в одну строку с разделителями табуляции с ключом в качестве столбца 1 и отдельными элементами из списка значений в виде столбцов 2-n. Я использовал следующий код для создания выходного файла с ключом в качестве столбца 1 и списком значений в качестве столбца 2, но я не уверен, как действовать дальше.

mydict = {'spider':['kate', 'susan'],
          'fish':['kate'],
          'dog':['andy'], 
          'cat':['andy','colby','jeff']} 
f = open('outfile.txt', 'w') 
writer = csv.writer(f, delimiter = '\t')
for key, value in orfdict.iteritems():
    writer.writerow([orf] + [value])

Документация по python предполагает, что вы можете использовать zip() для создания пар ключ:значение формы списка, но когда я пытаюсь это сделать в интерактивной подсказке:

>>> for key,value in mydict.iteritems():
...     mypair = zip(key,value)
...     print mypair

Я получаю этот странный вывод, поэтому я, очевидно, ничего не понимаю:

[('f', 'kate')]
[('c', 'andy'), ('a', 'colby'), ('t', 'jeff')]
[('s', 'kate'), ('p', 'susan')]
[('d', 'andy')]

Будет ли самый простой способ сделать это — создать пустой список для каждой итерации по словарю, а затем добавить к этому списку сначала ключ, а затем каждое из значений с отступом для цикла? Я чувствую, что должен что-то упустить.


person pandaSeq    schedule 02.04.2012    source источник
comment
Именно для этого предназначены JSON, XML и другие форматы структурированных документов. Почему вам нужно использовать CSV с разделителями табуляции?   -  person John Lyon    schedule 03.04.2012
comment
Странный вывод zip объясняется тем, что при взятии строки в контексте, который ожидает последовательность, выдаются отдельные символы строки; то есть строка действует как список символов. Таким образом, сжатие 'cat' с ['andy', 'colby', 'jeff'] разбивает cat на ['c', 'a', 't'].   -  person Russell Borogove    schedule 03.04.2012
comment
@jozzas - потому что я еще ничего не знаю об этих типах файлов ... но я добавил их в свой список для изучения. Спасибо!   -  person pandaSeq    schedule 03.04.2012
comment
@RussellBorogove - имеет смысл. Спасибо!   -  person pandaSeq    schedule 03.04.2012


Ответы (3)


Попробуйте это, чтобы добавить одно значение в существующий список:

writer.writerow([key] + value)

(key — одиночное значение, value — уже список)

person poke    schedule 02.04.2012
comment
Понял, спасибо! Я не очень понял функцию квадратных скобок, но это имеет смысл. - person pandaSeq; 03.04.2012
comment
Квадратные скобки в основном создают список. Итак, [1,2,3] создает список с элементами 1, 2 и 3. Точно так же [key] создает список с одним элементом: key. А затем вы объединяете созданный список с уже существующим. - person poke; 03.04.2012

Похоже, вы переименовали некоторые из своих переменных и не переименовали другие, я предполагаю, что вы имели в виду, что ваш код примера должен читать:

mydict = {'spider':['kate', 'susan'],
          'fish':['kate'],
          'dog':['andy'], 
          'cat':['andy','colby','jeff']} 
f = open('outfile.txt', 'w') 
writer = csv.writer(f, delimiter = '\t')
for key, value in mydict.iteritems():
    writer.writerow([key] + [value])

csv в этом случае кажется ненужным, почему бы не использовать:

mydict = {'spider':['kate', 'susan'],
          'fish':['kate'],
          'dog':['andy'],
          'cat':['andy','colby','jeff']}
f = open('outfile.txt', 'w')
for key, value in mydict.iteritems():
    f.write('%s\t%s\n' % (key,'\t'.join(value)))
f.close()
person Keith Schoenefeld    schedule 03.04.2012
comment
Привет, Кит. Это похоже на то, что я пробовал, но безуспешно. В этом случае этот код дает мне ошибку: Traceback (последний последний вызов): Файл /Users/zuma/scripts/stackoverflow.py, строка 9, в ‹module› f.write('%s\t%s\ n') % (key,'\t'.join(value)) TypeError: неподдерживаемые типы операндов для %: 'NoneType' и 'tuple' - person pandaSeq; 03.04.2012
comment
У меня было две ошибки, которые я бы определил, если бы протестировал код, приношу свои извинения — теперь код исправлен. - person Keith Schoenefeld; 03.04.2012
comment
Справедливости ради принятого ответа и использования вами библиотеки csv, она будет работать правильно, если значения в вашем объекте dict содержат то же значение, что и разделитель. Другими словами, если бы «kate» было «kate\tand\tjim», мой код привел бы к трем столбцам, когда он должен содержать только один, тогда как ответ csv правильно привел бы к одному столбцу для «kate\tand\tjunk». , но заключил бы его в двойные кавычки. Я указываю на это, потому что это делает ответ, использующий CSV, более правильным, а также добавляет что-то, что вам нужно, чтобы убедиться, что вы ищете при чтении результирующего CSV-файла. - person Keith Schoenefeld; 03.04.2012

Попробуйте изменить цикл for на следующее:

for key, value in orfdict.iteritems():
    writer.writerow([key] + value)

Поскольку значения в orfdict являются списками, на каждой итерации value будет списком. Например, в первой итерации key может быть 'spider', а value будет ['kate', 'susan'], поэтому [key] + value станет ['spider'] + ['kate', 'susan'] или ['spider', 'kate', 'susan'].

person Andrew Clark    schedule 02.04.2012