Próbuję utworzyć słownik z pliku CSV. Pierwsza kolumna pliku csv zawiera unikalne klucze, a druga kolumna zawiera wartości. Każdy wiersz pliku csv reprezentuje unikalną parę klucz-wartość w słowniku. Próbowałem użyć klas csv.DictReader
i csv.DictWriter
, ale mogłem tylko dowiedzieć się, jak wygenerować nowy słownik dla każdego wiersza. Chcę jeden słownik. Oto kod, którego próbuję użyć:
import csv
with open('coors.csv', mode='r') as infile:
reader = csv.reader(infile)
with open('coors_new.csv', mode='w') as outfile:
writer = csv.writer(outfile)
for rows in reader:
k = rows[0]
v = rows[1]
mydict = {k:v for k, v in rows}
print(mydict)
Po uruchomieniu powyższego kodu otrzymuję plik ValueError: too many values to unpack (expected 2)
. Jak utworzyć jeden słownik z pliku CSV? Dzięki.
python
csv
dictionary
list-comprehension
drbunsen
źródło
źródło
Odpowiedzi:
Uważam, że składnia, której szukałeś, jest następująca:
Alternatywnie, dla Pythona <= 2.7.1, chcesz:
źródło
Otwórz plik, wywołując otwórz, a następnie
csv.DictReader
.Możesz iterować po wierszach obiektu czytnika dykt pliku csv, wykonując iterację po pliku input_file.
LUB Aby uzyskać dostęp tylko do pierwszej linii
AKTUALIZACJA W wersjach Pythona 3+ ten kod by się trochę zmienił:
źródło
next(dictobj)
zamiastdictobj.next()
w wersjach Python 3+.źródło
for row in reader: k, v = row
jeślifor k, v in reader
na przykład możesz po prostu pisać . A jeśli spodziewasz się, że czytnik jest iterowalny, wytwarzający elementy dwuelementowe, możesz po prostu przekazać go bezpośrednio do dyktowania do konwersji.d = dict(reader)
jest znacznie krótszy i znacznie szybszy w przypadku ogromnych zbiorów danych.for row in reader
paradygmacie, to może (po długoterminowym opracowaniu) być bardziej praktyczne. Zgadzam się z tobą na krótko, ale uważaj na przedwczesną optymalizację.To nie jest eleganckie, ale jednoprzewodowe rozwiązanie wykorzystujące pandy.
Jeśli chcesz określić dtype dla swojego indeksu (nie można go określić w read_csv, jeśli używasz argumentu index_col z powodu błędu ):
źródło
Musisz po prostu przekonwertować csv.reader na dyktowanie:
źródło
ValueError: dictionary update sequence element #2 has length 3; 2 is required
.filter
połączenia zmap(operator.itemgetter(slice(2)), ...)
, więc będzie to ciągnąć tylko dwa pierwsze iterms, czyniąc go:dict(map(operator.itemgetter(slice(2)), filter(None, csv.reader(f))))
. Jeśli jest to Python 2, upewnij sięfrom future_builtins import map, filter
, że tak, więcdict
czyta generator bezpośrednio, zamiastlist
najpierw tworzyć wiele niepotrzebnych tymczasowych znaków).Możesz również użyć do tego numpy.
źródło
Sugerowałbym dodanie
if rows
w przypadku, gdy na końcu pliku znajduje się pusta liniaźródło
Rozwiązanie jednowarstwowe
źródło
Jeśli nie masz nic przeciwko korzystaniu z pakietu numpy, możesz zrobić coś takiego:
źródło
W przypadku prostych plików csv, takich jak poniższe
Możesz przekonwertować go na słownik Pythona, używając tylko wbudowanych
Powinno to dać następujący słownik
Uwaga: słowniki Pythona mają unikalne klucze, więc jeśli plik csv zawiera duplikaty
ids
, należy dołączyć każdy wiersz do listy.źródło
set_default
: csv_dict.set_default (klucz, []). append ({klucz: wartość klucza, wartość w zip (nagłówek, wartości)})).append
poleceniu była bardzo przydatna. Skończyło się na tym, że użyłem tej samej składnirow.update
podczas iteracji i dodawania doDictReader
obiektu, który został utworzony z pliku CSV.Możesz tego użyć, jest całkiem fajny:
źródło
Zostało opublikowanych wiele rozwiązań i chciałbym wnieść swój wkład w moje, które działa dla innej liczby kolumn w pliku CSV. Tworzy słownik z jednym kluczem na kolumnę, a wartością dla każdego klucza jest lista z elementami w takiej kolumnie.
źródło
na przykład z pandami jest znacznie łatwiej. zakładając, że masz następujące dane jako CSV i nazwijmy to
test.txt
/test.csv
(wiesz, że CSV to rodzaj pliku tekstowego)teraz za pomocą pand
byłoby to dla każdego rzędu
i to wszystko.
źródło
Spróbuj użyć
defaultdict
iDictReader
.Zwraca:
źródło