ожидаемый объект str, bytes или os.PathLike, а не InMemoryUploadedFile - PullRequest
0 голосов
/ 01 июня 2018

У меня есть метод для чтения файла Newick и возврата строки в инфраструктуре Django, который выглядит следующим образом:

def handle_uploaded_file(f):
    output = " "
    for chunk in f.chunks():
        output += chunk.decode('ascii')
    return output.replace("\n", "").replace("\r", "")


def post(self, request):
    form = HomeForm(request.POST, request.FILES)
    if form.is_valid():
        input = handle_uploaded_file(request.FILES['file'])
        treeGelezen = Tree(input, format=1)
        script, div = mainmain(treeGelezen)
        form = HomeForm()
    args = {'form': form, 'script': script, 'div': div}
    return render(request, self.template_name, args)

, который отлично работает для обычных файлов Newick, но у меня также есть некоторые файлы со строкойв начале файла.Я пытаюсь сделать другой метод, который проверяет, есть ли перед файлом следующая строка (что имеет место в некоторых файлах): "newick;"и удаляет строку, если найдена.Это работает локально, но я не могу объединить их.Вот как это выглядит локально:

def removeNewick(tree_with_newick):
    for x in tree_with_newick:
        if x.startswith('newick;'):
            print('')
    return x


filepath = "C:\\Users\\msi00\\Desktop\\ncbi-taxanomy.tre"
tree_with_newick = open(filepath)
tree = Tree(newick=removeNewick(tree_with_newick), format=1)

, который отлично работает, когда я указываю путь только в python, поэтому я попытался объединить их в Django так:

def handle_uploaded_file(f):
    tree_with_newick = open(f)
    for x in tree_with_newick:
        if x.startswith('newick;'):
            print('')
    return cutFile(x)


def cutFile(f):
    output = " "
    for chunk in f.chunks():
        output += chunk.decode('ascii')
    return output.replace("\n", "").replace("\r", "")


def post(self, request):
    form = HomeForm(request.POST, request.FILES)
    if form.is_valid():
        input = handle_uploaded_file(request.FILES['file'])
        treeGelezen = Tree(input, format=1)
        script, div = mainmain(treeGelezen)
        form = HomeForm()
    args = {'form': form, 'script': script, 'div': div}
    return render(request, self.template_name, args)

Что не 'не работает и выдает следующую ошибку:

expected str, bytes or os.PathLike object, not InMemoryUploadedFile

Я работаю над этим уже два дня и не могу понять, почему появляется ошибка.

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

В моем setting.py у меня было

MEDIA_ROOT = os.path.join(BASE_DIR, 'media'),

, когда это должно было быть

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

, которое решило эту ошибку для меня.

0 голосов
/ 01 июня 2018

Ошибка возникает из-за того, что функция handle_uploaded_file(f) пытается открыть уже открытый файл.

Значение request.FILES['file'] является InMemoryUploadedFile и может использоваться как обычный файл.Вам не нужно открывать его снова.

Чтобы исправить, просто удалите строку, которая пытается открыть файл:

def handle_uploaded_file(f):
    for x in f:
        if x.startswith('newick;'):
            print('')
    return cutFile(x)
...