Mam model Django z wieloma polami (około 24), i widocznie moi użytkownicy chcieliby móc tworzyć wystąpienia tego obiektu za pomocą ładowania arkusza kalkulacyjnego zamiast ręcznego wprowadzania wszystkich danych w formy.Parse CSV z Django i csv.DictReader
Zauważyłem, że użycie wbudowanego w Pythona modułu CSV powinno sprawić, że będzie to dość proste, ale ciężko pracuję nad tym, jak go dokładnie użyć.
Zacznijmy z tym, co mam pod względem kodu:
def upload_file(request):
if request.method == "POST":
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
handle_files(request.FILES['file'])
return HttpResponseRedirect('/workflow/')
else:
print form.errors
print request.FILES
return HttpResponseRedirect('/workflow/upload')
else:
form = UploadFileForm()
return render(request, 'fileform.html', {'formset': form})
Ten akceptuje plik CSV jako przesyłanie i ręce go do handle_files
do czynienia z parsowania i tworzenia obiektów. To jest metoda, z którą mam problem.
def handle_files(f):
reader = csv.DictReader(f, delimiter=' ', quotechar='|')
... #?
Próbowałem naśladować docs Pythona (http://docs.python.org/2/library/csv.html), ale DictReader jest bardzo słabo udokumentowane. Czy dostarczam odpowiednie argumenty w postaci csv.DictReader()
? Jeśli mam, jak mogę uzyskać informacje z reader
? Będę dostarczał użytkownikom szablon, więc mogę założyć, że każda kolumna pliku CSV ma przewidywalne dane. To znaczy, wiem, że kolumna A będzie zawierała dane odpowiadające polu X, a kolumna B odpowiada wartości Y itp. Jak wykonać przetwarzanie danych z czytnika, a następnie utworzyć obiekt z tymi danymi?
Zgaduję, to będzie coś takiego:
for row in reader:
X=row[1]
Y=row[2]
#etc
my_object = MyObject(x=X, y=Y)
my_object.save()
Czy to daleko? Czy powinienem używać innego typu czytnika CSV?
Dzięki za pomoc, wiem, że w tym poście jest wiele pytań.
Jaki jest sens DictReader wtedy? –
[docs] (http://docs.python.org/2/library/csv.html#csv.DictReader) mówi, że "utworzy obiekt działający jak zwykły czytnik, ale odwzorowuje informacje odczytane w dyktafonie którego klucze są podane przez opcjonalny parametr fieldnames.Jeśli parametr fieldnames zostanie pominięty, wartości w pierwszym wierszu pliku csv będą używane jako nazwy pól. " Co brzmi, jakbyś mógł użyć wiersza ["Kolumna A"] (lub innego klucza w zależności od nazwy kolumny) –