#python #django #python_2x
Окружение:
Windows 8
Python 2.7.9
Django 1.6
openpyxl (для работы с файлами формата "*.xlsx")
Основная задача:
Получить от пользователя файл формата "*.xlsx", прочитать его и загрузить данные
в Систему.
Шаг на котором возникает проблема:
попытка переименовать файл (для приведения к нужному типу)
Traceback:
File "C:\PythonPtoject\venv\Mygtn\lib\site-packages\django\core\handlers\base.py"
in get_response
114. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\PythonPtoject\project\MyGtn\MyGtn\AppGtn\views.py" in appgtn_import_in_system
266. os.rename(abs_file_data,abs_file_data_path + '.' + file_extension)
Exception Type: WindowsError at /register/import_in_system/
Exception Value: 32 ������� �� ����� �������� ������ � �����
Пояснения:
Для получения файла от пользователя использую простой html ("<" и ">" убрал специльно):
form action="/register/import_in_system/" method="post"
enctype="multipart/form-data">{% csrf_token %}
input type="file" name="file_to_import">
button type="submit">Загрузить файл импорта
/form
После выбора пользователем файла и нажатия кнопки "Загрузить файл импорта" файл сохраняется
во временную папку (механизм сохранения по умолчанию) с расширением "*.upload"
Пример: C:\users\sss\appdata\local\temp\t6rjr4.upload
Данное расширение openpyxl не понимает, поэтому я пытаюсь переименовать файл, а точнее
сменить у него расширение с ".upload" на ".xlsx" используя os.rename()
код с переименованием:
abs_file_data = 'c:\\users\\sss\\appdata\\local\\temp\\t6rjr4.upload' # (текущий
абсолютный путь до файла)
abs_file_data_path = 'c:\\users\\sss\\appdata\\local\\temp\\t6rjr4' # (абсолютный
путь до файла без расширения)
file_extension = u'xlsx' # (новое расширение файла)
os.rename(abs_file_data,abs_file_data_path + '.' + file_extension)
Но при попытке выполнить эту строчку возникает указанная выше ошибка.
Ответы
Ответ 1
Попробуйте переименовывать не после загрузки, а средствами Django указывать правильный путь загрузки (вместе с названием файла) def content_file_name(instance, filename): ext = os.path.splitext(filename) filename = "%s_%s.%s" % (instance.user.id, instance.id, ext) return os.path.join('uploads', filename) class MyFileUpload(models.Model): # ... file = models.FileField(upload_to=content_file_name)
Комментариев нет:
Отправить комментарий