2014-09-09 3 views
0

Я пытаюсь создать файл csv в другой каталог. При выполнении кода на сервере разработки он работает отлично, но на производстве, он выдает ошибку, что No such file or directory:Нет такого файла или каталога: Python CSV

Ниже мой код: -

def write_operation(filename,data): 
    with open("./static/" + filename, "wb") as f: 
     writer = csv.writer(f) 
     writer.writerows(data) 

@csrf_exempt 
def download_data(request): 

    if request.POST.has_key('download_data'): 
     start_date = str(request.POST['start_date']).replace('/','-') 
     end_date = str(request.POST['end_date']).replace('/','-') 

     start_date = datetime.datetime.strptime(start_date, "%Y-%m-%d %H:%M") 
     end_date = datetime.datetime.strptime(end_date, "%Y-%m-%d %H:%M") 


     data.insert(0,('Barcode','Weight', 'Length','Breadth','Height')) 
     write_operation('data.csv',data) 

     return HttpResponse(json.dumps('Success'),content_type = "application/json") 
    ctx = {} 
    return render(request, 'dummy/download_data.html', ctx) 

Ошибка, я получаю это: -

Exception Value: [Errno 2] No such file or directory: 'static/data.csv'

Вот моя структура каталогов: -

├── modules 
|   ├── dummy 
│   │   └── views.py 
├── static 
+0

Вы уверены, что используете его с нужного уровня каталога? Это похоже на относительный путь. (Я предполагаю, что вы дважды проверили, что файл есть) – Ajean

+0

Файл есть. Просто чтобы проверить, я создал файл вручную. Пробовал 'localhost: 8000/static/data.csv', он становится открытым (также на производстве), но все еще не может записать данные через код. – PythonEnthusiast

+0

Просто дважды проверяйте ... это случается с лучшими из нас. – Ajean

ответ

0

Вы можете использовать полный путь для предотвращения этих ошибок. Например, ваша папка проекта /home/project-name/. Вы можете определить константу в своей конфигурации и установить домашнюю папку проекта как base_dir. Затем измените свой код следующим образом:

def write_operation(filename,data): 
    with open(config.base_dir + "static/" + filename, "wb") as f: 
     writer = csv.writer(f) 
     writer.writerows(data) 

Edit: я пропустил сценарий, связанный с Джанго. Выше решение является общим решением для python. Версия Django почти такая же.

Добавить settings.py файл следующие строки

import os 

BASE_DIR = os.path.dirname(os.path.dirname(__file__)) 

И изменить метод со следующими:

from django.conf import settings 
... 

def write_operation(filename,data): 
with open(settings.BASE_DIR + "static/" + filename, "wb") as f: 
    writer = csv.writer(f) 
    writer.writerows(data) 

В самом деле, оба они одно и то же на базе.

+0

Хорошо работает. Но что не так с относительным путем. и разница в развитии производства ??? – PythonEnthusiast

+0

Я думаю, что когда вы работаете над разработкой, вы переходите в каталог проекта и запускаете скрипт с помощью 'python manage.py runningerver'. При производстве вы можете использовать 'python /path-the-directory/.../manage.py runerver'. Или вы можете использовать другую операционную систему с производством и разработкой. – hkulekci

0

Для избежания такой проблемы просто использовать значение base_dir, который инициализируется и назначается в вашем проекте settings.py

Как говорится в официальной документации:

пути сборки внутри проекта, как это : os.path.join (BASE_DIR, ...)

Смежные вопросы