У меня есть файл .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')