HiveBrain v1.2.0
Get Started
← Back to all entries
patternpythondjangoMinor

Creating a pythonic snippet to read and clean .csv files

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
pythonicsnippetreadcreatingcsvfilesandclean

Problem

I am trying to import a .csv file, clean the contents, and make sure all the errors are eliminated.

  • IO error



  • file format error



  • data error



I am using the snippet below. Could someone help me clean it and make it more pythonic?

try:
    fl = request.FILES['csv']
except:
    return HttpResponse("Some IO Error")
try:    
    reader = csv.reader(fl)
except:
    return HttpResponse("File Not Supported")
reader.next() # this makes sure the heading is 
cleaned_csv_content = list()
for row in reader:
    err = 0
    fname, lname, e_mail  = row
    try:
        validate_email(email)
    except:
        pass
        err = 1
    if not err:
        cleaned_csv_content.append(fname, lname, e_mail)

Solution

Firstly, you should raise not return your errors.

Secondly, try: with a bare except: is bad practice (e.g. http://blog.codekills.net/2011/09/29/the-evils-of--except--/); what do you expect could go wrong with each step? Test for specific errors and deal with them appropriately. It is this which has hidden the NameError I mention at the end.

Thirdly, your use of the flag err seems a bit odd; much more Pythonic to use an actual boolean err = False or, better, else::

try:
    validate_email(e_mail) # see comment below
except: # but only the errors you expect - see above 
    pass
else:
    cleaned_csv_content.append((fname, lname, e_mail)) # note additional parentheses


or, even better, refactor validate_email to return True for a valid email and False otherwise, rather than raising errors:

if validate_email(e_mail):
    cleaned_csv_content.append((fname, lname, e_mail))


Finally, note that "email" != "e_mail".

Code Snippets

try:
    validate_email(e_mail) # see comment below
except: # but only the errors you expect - see above 
    pass
else:
    cleaned_csv_content.append((fname, lname, e_mail)) # note additional parentheses
if validate_email(e_mail):
    cleaned_csv_content.append((fname, lname, e_mail))

Context

StackExchange Code Review Q#37298, answer score: 6

Revisions (0)

No revisions yet.