Как записать элементы списка в файл с разделителями табуляции? - PullRequest
0 голосов
/ 24 мая 2018

Я искал в Интернете, но не нашел ответа на мою проблему:

У меня есть словарь со списками в качестве элементов, и каждый список имеет разную длину.Например, вот так:

dict_with_lists[value1] = [word1, word2, word3, word4]
dict_with_lists[value2] = [word1, word2, word3]

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

Я нашел такое решение:

with open('fname', 'w') as file:
   file.writelines('\t'.join(i) + '\n' for i in nested_list)

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

Ответы [ 4 ]

0 голосов
/ 24 мая 2018

Необходимо преобразовать каждое значение list в словаре в строку значений, разделенных табуляцией, которые также имеют символ новой строки '\n' в конце каждого из них:

value1, value2 = 'key1', 'key2'
dict_with_lists = {}
dict_with_lists[value1] = ['word1', 'word2', 'word3', 'word4']
dict_with_lists[value2] = ['word1', 'word2', 'word3']

fname = 'dict_list_values.tsv'

with open(fname, 'w') as file:
    file.writelines(
        '\t'.join(values)+'\n' for values in dict_with_lists.values()
    )
0 голосов
/ 24 мая 2018

Я думаю, что вы делаете понимание списка по списку внутри словаря.Альтернативное решение было бы

with open('fname', 'w') as file:
    for nested_list in dict_with_lists.values():
        for word in nested_list:
             file.write(word + '\t')
         file.write('\n')

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

0 голосов
/ 24 мая 2018

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

Существует еще один способ хранения таких данных (словари не табличной формы)) и сохранить его в формате JSON-строки.

import json
with open('fname','w') as f:
    json.dump(dict_with_lists, f)

И тогда код для его загрузки будет:

import json
with open('fname') as f:
    dict_with_lists = json.load(f)
0 голосов
/ 24 мая 2018

Если nested_list является одним из значений словаря, то вы применяете '\t'.join() к отдельным словам.Вы хотели бы присоединиться к всему списку :

file.write('\t'.join(nested_list) + '\n')

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

file.writelines(
    '\t'.join(nested_list) + '\n'
    for nested_list in dict_with_lists.values())

Вышеправильно использует file.writelines() метод ;передавая в повторяемую строку для записи .Если вам нужно было передать одну строку, то вы только заставляете Python выполнять дополнительную работу, поскольку он перебирает все отдельные символы этой строки, чтобы записать их отдельно, после чего базовый буфер должен снова собрать их обратно в более крупные строки.

Однако здесь нет необходимости заново изобретать колесо записи с разделенными символами значениями.Используйте модуль csv , установив разделитель на '\t':

import csv

with open('fname', 'w', newline='') as file:
    writer = csv.writer(file, delimiter='\t')
    writer.writerows(dict_with_lists.values())

Выше записывает все списки в словаре dict_with_lists в файл,Объект csv.writer() не возражает, если ваши списки имеют разную длину.

...