【问题标题】:expected str, bytes or os.PathLike object, not InMemoryUploadedFile预期的 str、bytes 或 os.PathLike 对象,而不是 InMemoryUploadedFile
【发布时间】:2018-11-11 07:08:35
【问题描述】:

我有一个读取 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

我已经研究了两天,无法弄清楚为什么会弹出错误。

【问题讨论】:

  • 能否请您添加完整的堆栈跟踪?这可能有助于找出哪条线路有问题。
  • 另外:if x.startswith('newick;'): print('') 部分似乎对处理没有任何影响。它的目的是什么?

标签: python django ncbi ete3


【解决方案1】:

发生错误是因为函数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)

【讨论】:

  • 出现一个新错误,即:startswith first arg must be bytes or a tuple of bytes, not str 有什么解决办法吗?
  • 显然,我必须在字符串之前添加字母 b,但现在我得到:'bytes' 对象没有属性 'chunks'
  • 很好的解释。谢谢!
【解决方案2】:

在我的setting.py中我有

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

应该是什么时候

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

它为我解决了这个错误。

【讨论】:

    猜你喜欢
    • 2018-12-20
    • 2018-11-08
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 2022-01-17
    相关资源
    最近更新 更多