Загрузка файла CSV с фиксированным форматом

У меня есть файл .csv, который мои пользователи должны загрузить, ввести некоторые данные и загрузить на мой сайт.

Есть ли лучший способ обеспечить успешную загрузку данных на основе приведенного ниже фрагмента? Что еще я должен проверить? Было бы лучше использовать диалект?

def import(resident_file):

    try:
        file = resident_file.file.path
        reader = csv.reader(open(file, 'rU'), delimiter=',', quotechar='"')
        headerline = reader.next()

        for row in reader:
            try:
                # do stuff

            except Exception, e:
                print e

    except Exception, e:
        print e

Пример проблемы, с которой я столкнулся, заключается в том, что когда пользователь открывает файл, вводит данные и сохраняет их, разделители меняются с , на ; . Как я могу охватить различные типы разделителей, в которых документ может быть сохранен из-за того, что он открыт в разных программах, например, в Excel в Windows, в Excel в Mac, в открытом офисе в Mac, в открытом офисе в Linux и т. Д.

Другой пример Проблема заключается в том, что когда пользователь пытается скопировать и вставить данные в предоставленный шаблон, все начинается ад.

ОБНОВЛЕНИЕ Я использую класс Sniffer сейчас, как упоминалось в одном из ответов ниже, но это все еще не доказательство дурака.

ОБНОВЛЕННЫЙ КОД SNIPPET

def bulk_import_residents(condo, resident_file):

    """
    COL 1       COL 2       COL 3           COL 4           COL 5        
    first_name  last_name   contact_number  unit_number     block_number

    """

    file_path = resident_file.file.path
    csvfile = open(file_path, 'rb')
    dialect =  csv.Sniffer().sniff(csvfile.read(1024))
    csvfile.seek(0)
    reader = csv.reader(csvfile, dialect)
    headerline = reader.next()

    for row in reader:
        try:
            data = ResidentImportData()
            data.condo = condo
            data.file = resident_file
            data.first_name = row[0]
            data.last_name = row[1] 
            data.contact_number = row[2]
            data.unit_number = row[3]
            data.block_number = row[4]
            data.save()
        except Exception, e:
            print '{0}'.format(e)
            raise Http404('Wrong template format')
6
задан super9 7 February 2012 в 02:34
поделиться