Mam słownik podobny do następującego przykładu:

dict = {key1: value1, key2: [arrayValue1, arrayValue2]}

Chciałbym napisać go do pliku CSV w tym formacie:

key1     key2
value1   arrayValue1
         arrayValue2

Wyszukiwanie podobnych pytań znalazłem sposób napisania słownika, jeśli wszystkie wartości są skalarne lub tablicy, ale nie znalazłem odpowiedzi, jeśli wartości są kombinacją tych dwóch.

Mam następujący kod do pisania wartości skalarnych:

with open(filename, 'w') as f:  
        w = csv.DictWriter(f, dict.keys())
        w.writeheader()
        w.writerow(dict)

Oraz następujący kod do pisania wartości tablicy:

with open(filename, "w") as outfile:
        writer = csv.writer(outfile)
        writer.writerow(dict.keys())
        writer.writerows(zip(*dict.values()))

Z góry dziękuję.

1
Brandon S. 24 luty 2019, 16:25

2 odpowiedzi

Najlepsza odpowiedź

Nie deklaruj zmiennych o nazwie {x0}}, ponieważ stoi wbudowaną funkcję Pythona, której użyjemy tutaj. Raczej użyj czegoś takiego jak dct.

dct = {"key1": "value1", "key2": ["arrayValue1", "arrayValue2"]}

Najpierw włóż każdy skalar wewnątrz tablicy.

myvalues = [ x if isinstance(x, list) else [x] for x in dct.values() ]

Następnie wykonaj każdą tablicę tak długo jak największa tablica. Wypełnij luki pustymi ciągami.

maxlength = max([len(x) for x in myvalues])
myvalues = [ x + (maxlength - len(x))*[""] for x in myvalues ]

Teraz możesz po prostu odbudować swój słownik, przekonwertować go w pandas dataframe i zapisz tę bazę danych jako plik CSV.

import pandas as pd
dct = dict(zip(dct.keys(), myvalues))
df = pd.DataFrame.from_dict(dct)
df.to_csv("your_filename_goes_here.csv", index=False)

A następnie masz swój plik.

0
Ruan 24 luty 2019, 13:53

Możesz to zrobić, tworząc bardziej regularny słownik, w którym wszystkie klucze mają listy równych rozmiarów.

 outputDict = { key: value if isinstance(value,list) else [value] for key,value in dict.items() }
 padding = [""] * max( len(value) for value in outputDict.values() )
 outputDict = { key: (value + padding)[:len(padding)] for key,value in outputDict.items() }
 writer.writerow(outputDict.keys())
 writer.writerows(zip(*outputDict.values()))
0
Alain T. 24 luty 2019, 14:00