预期的 str、字节或操作系统.PathLike 对象,而不是 InMemoryUploadedFile



我有一个方法可以读取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

我已经为此工作了两天,无法弄清楚为什么会出现错误。

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

我的解决方案;

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

而不是:

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

在 settigs.py

在我的 setting.py 中,我有

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

当它应该在

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

这为我解决了这个错误。

将 InMemoryUploadedFile 保存到临时文件。

您可以将内存上传文件保存到临时文件,然后从该文件读取数据。

import tempfile
if input:
with tempfile.NamedTemporaryFile(delete=False) as temp_file:
temp_file.write(input.read())
temp_file.close()
with open(temp_file.name, 'r') as file:
image_data = file.read()

最新更新