Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

Ошибка “WindowsError” при попытке переименовать файл с помощью os.rename()

#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)

Комментариев нет:

Отправить комментарий