Skip to content

Instantly share code, notes, and snippets.

@bebosudo
Last active September 1, 2018 17:33
Show Gist options
  • Save bebosudo/564c88f36cd18ee896629d4dfae6f21f to your computer and use it in GitHub Desktop.
Save bebosudo/564c88f36cd18ee896629d4dfae6f21f to your computer and use it in GitHub Desktop.
Example of how to iterate over an uploaded file in django (2.1) using generic base classes.
# --- forms.py ---
class CSVImportForm(forms.Form):
file = forms.FileField()
comment = forms.CharField(max_length=50, required=False)
# --- utils.py ---
csv_sep = ","
person_csv = ("name",
"surname",
"birth_date",
"sex",
)
def _split_and_clean(row):
"""Split a line and remove any whitespace at the sides of each field."""
return (field.strip() for field in row.split(csv_sep))
def temp_file_iterator(temp_file, encoding="utf-8"):
return (_split_and_clean(row) for b_row in temp_file.chunks() for row in b_row.decode(encoding).split("\n")[:-1])
# --- views.py ---
class RowIteratorCSVUpload:
def get_rows_from_csv(self, temp_file):
"""Return a generator of dicts from the lines of the input temp file."""
return (dict(zip(self.__class__.csv_header, row)) for row in utils.temp_file_iterator(temp_file))
class PersonCSVUploadView(TemplateView, FormView, RowIteratorCSVUpload):
template_name = "my_app/person_import.html"
model = models.Person
form_class = forms.CSVImportForm
csv_header = utils.child_csv
def form_valid(self, form):
temp_file = form.cleaned_data["file"]
for row_num, person_dict in enumerate(self.get_rows_from_csv(temp_file)):
print(row_num, person_dict)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment