записать словарь списков в файл с разделителями табуляции в python, со значениями ключа словаря в виде столбцов без Pandas - PullRequest
2 голосов
/ 17 марта 2020

словарь, который я использую, это:

dict={'item': [1,2,3], 'id':['a','b','c'], 'car':['sedan','truck','moped'], 'color': ['r','b','g'], 'speed': [2,4,10]}

Я пытаюсь создать разделенную табуляцией строку:

item    id
1       a
2       b
3       c

Код, который я написал:

with open('file.txt', 'w') as tab_file:
    dict_writer = DictWriter(tab_file, dict.keys(), delimiter = '\t')
    dict_writer.writeheader()
    dict_writer.writerows(dict)

В частности, я борюсь с записью в файл в виде столбцов. Это означает, что ключи словаря заполняются как заголовок, а значения словаря заполняются вертикально под соответствующим заголовком. Кроме того, я не могу позволить себе роскошь использовать Pandas

Ответы [ 4 ]

1 голос
/ 17 марта 2020

Вот способ сделать это с помощью одноразовой функции и zip:

d = {
    'item': [1, 2, 3],
    'id': ['a', 'b', 'c'],
    'car': ['sedan', 'truck', 'moped'],
    'color': ['r', 'b', 'g'],
    'speed': [2, 4, 10],
    }

def row_printer(row):
    print(*row, sep='\t')

row_printer(d.keys())  # Print header
for t in zip(*d.values()):  # Print rows
    row_printer(t)

Для печати в файл: print(..., file='file.txt')

1 голос
/ 17 марта 2020

Это решение будет работать для неоднозначного числа элементов и подпунктов в dict:

d = {'item': [1, 2, 3], 'id': [4, 5, 6]}

for i in d:
    print(i + "\t", end="")
    numSubItems = len(d[i])
print()


for level in range(numSubItems):
    for i in d:
        print(str(d[i][level]) + "\t", end="")
    print()



РЕДАКТИРОВАТЬ: реализовать это с записью в текст файл:

d = {'item': [1, 2, 3], 'id': [4, 5, 6], 'test': [6, 7, 8]}


with open('file.txt', 'w') as f:
    for i in d:
        f.write(i + "\t")
        numSubItems = len(d[i])
    f.write("\n")

    for level in range(numSubItems):
        for i in d:
            f.write(str(d[i][level]) + "\t")
        f.write("\n")
0 голосов
/ 17 марта 2020

Вместо использования csv.DictWriter вы также можете использовать такой модуль, как pandas, для этого:

import pandas as pd

df = pd.DataFrame.from_dict(d)
df.to_csv(“test.csv”, sep=“\t”, index=False)

Возможно, вам сначала нужно установить его, используя

pip3 install pandas

См. здесь для примера.

0 голосов
/ 17 марта 2020

Вы можете использовать простой l oop с zip:

d={'item': [1,2,3], 'id':["a","b","c"]}

print('item\tid')
for num, letter in zip(d['item'], d['id']):
    print('\t'.join(str(num) + letter))

item    id
1       a
2       b
3       c

РЕДАКТИРОВАТЬ:
Если вы не хотите жестко кодировать имена столбцов, вы можете использовать это:

d={'item': [1,2,3], 'id':["a","b","c"]}

print('\t'.join(d.keys()))
for num, letter in zip(*d.values()):
    print('\t'.join(str(num) + letter))

Однако порядок столбцов гарантируется только в python3.7+, если вы используете словарь. Если у вас более низкая версия python, используйте вместо нее orderedDict, например:

from collections import OrderedDict

d=OrderedDict({'item': [1,2,3], 'id':["a","b","c"]})

print('\t'.join(d.keys()))
for num, letter in zip(*d.values()):
    print('\t'.join(str(num) + letter))
...