Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python/Pyramid:这个函数是否允许用户上传文件,然后解析它们?_Python_File Upload_Pyramid - Fatal编程技术网

Python/Pyramid:这个函数是否允许用户上传文件,然后解析它们?

Python/Pyramid:这个函数是否允许用户上传文件,然后解析它们?,python,file-upload,pyramid,Python,File Upload,Pyramid,现在我有这个表格: <form action="/store_stl_data" method="post" accept-charset="utf-8" enctype="multipart/form-data"> <label for="stl">STL</label> <input id="stl" name="stl" type="file" value="" /> <input type="s

现在我有这个表格:

<form action="/store_stl_data" method="post" accept-charset="utf-8"
      enctype="multipart/form-data">

    <label for="stl">STL</label>
    <input id="stl" name="stl" type="file" value="" />

    <input type="submit" value="submit" />
</form>
defstore\u stl\u data(request):
下面的三行是我最不确定的。我是从你那儿买的

我希望这样,当人们上传文件时,整个
store\u stl\u data
函数运行并处理输入文件

现在它给了我一个错误:

KeyError: "No key 'stl': Not a form request"
这也是我的路线,在
\uuuu init\uuuuuuy.py
中:

from pyramid.config import Configurator
from sqlalchemy import engine_from_config

from .models import (
    DBSession,
    Base,
    )


def main(global_config, **settings):
    """ This function returns a Pyramid WSGI application.
    """
    engine = engine_from_config(settings, 'sqlalchemy.')
    DBSession.configure(bind=engine)
    Base.metadata.bind = engine
    config = Configurator(settings=settings)
    config.add_static_view('static', 'static', cache_max_age=3600)
    config.add_route('view_wiki', '/')
    config.add_route('view_page', '/{pagename}')
    config.add_route('add_page', '/add_page/{pagename}')
    config.add_route('edit_page', '/{pagename}/edit_page')
    config.scan()
    return config.make_wsgi_app()

从请求中获得的
.file
对象已经是一个打开的文件(like)对象

如果仔细查看链接到的文档中的示例,它将使用上载文件名创建一个新文件,并使用上载的文件将数据写入该新文件<代码>输入_文件从未在该代码中打开,只有
输出_文件
打开(注意不同的变量名)

您也不需要关闭文件对象,因此不需要使用
关闭
。您的代码可以简化为:

def store_stl_data(request):
    input_file=request.POST['stl'].file
    i1, i2 = itertools.tee(input_file)
    vertices = [map(float, line.split()[1:4])
                for line in i1
                if line.lstrip().startswith('vertex')]

    normals = [map(float, line.split()[2:5])
                for line in i2
                if line.lstrip().startswith('facet')]
我个人不会使用
itertools.tee
但是,在构建顶点时,您正在将整个文件读入
tee
缓冲区

相反,我将使用单个循环:

def store_stl_data(request):
    input_file=request.POST['stl'].file
    vertices, normals = [], []
    for line in input_file
        parts = line.split()
        if parts[0] == 'vertex':
            vertices.append(map(float, parts[1:4]))
        elif parts[0] == 'facet':
            normals.append(map(float, parts[2:5]))
现在,内存中一次只保留一条线(加上顶点和法线结构)


注意:如果您收到
KeyError:No key'…':不是表单请求
错误消息,则视图没有收到
POST
HTTP请求。请仔细检查您的表单方法是否设置为
“POST”
(大小写无关紧要)。

我看没问题。你试过了吗?如果你有代码,应该可以很容易地看到它的功能和工作原理。记住也要编写测试<代码>输入文件
已经是打开的文件对象。您不需要再次打开它。我已经更新了代码及其显示的错误消息。您为什么有
存储stl\u文件
存储stl\u数据
?是否有两个函数,或者其中一个是函数名的路由名?谢谢提示。我已经用你的解决方案更新了这个问题和我的代码,尽管它现在给了我一个错误(参考问题),你确实上传了一个文件吗?“stl”键不在帖子中。不,我已经更新了代码以响应您的回答。现在更新的问题中引用的关键错误发生在我尝试提交表单时。好的,确切的错误意味着您没有提出POST请求。您确定设置了正确的路由/表单/处理程序吗?我已将路由(init.py)添加到我的问题中。至于表单和处理程序,我的印象是它们分别是@view_config和def store_stl_data函数,这不是真的吗?
def store_stl_data(request):
    input_file=request.POST['stl'].file
    vertices, normals = [], []
    for line in input_file
        parts = line.split()
        if parts[0] == 'vertex':
            vertices.append(map(float, parts[1:4]))
        elif parts[0] == 'facet':
            normals.append(map(float, parts[2:5]))