预期的 str、bytes 或 os.PathLike 对象,而不是 InMemoryUploadedFile
expected str, bytes or os.PathLike object, not InMemoryUploadedFile
我有一种方法可以读取 Newick 文件和 return 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
我已经研究了两天了,但无法弄清楚为什么会弹出错误。
错误发生是因为函数 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)
在我的 setting.py 我有
MEDIA_ROOT = os.path.join(BASE_DIR, 'media'),
什么时候应该
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
为我解决了这个错误。
我有一种方法可以读取 Newick 文件和 return 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
我已经研究了两天了,但无法弄清楚为什么会弹出错误。
错误发生是因为函数 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)
在我的 setting.py 我有
MEDIA_ROOT = os.path.join(BASE_DIR, 'media'),
什么时候应该
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
为我解决了这个错误。