Python 将csv数据导入web2py数据库并处理上载

Python 将csv数据导入web2py数据库并处理上载,python,web2py,Python,Web2py,我用web2py制作了一个非常简单的单用户数据库应用程序,并将其部署到桌面计算机上。我选择web2py的原因是它的简单性和它的非侵入性web服务器 我的问题是,我需要将一个现有数据库从另一个我刚刚预处理并准备好的应用程序迁移到一个csv文件中,该文件现在可以完美地导入web2py的sqlite数据库 现在,其中一个表中的“upload”字段出现问题,对应于一个小图像,我已将该字段格式化为反csv,并使用从原始数据库中提取的相应.jpg文件的名称。问题是,我没有设法将这些文件正确地插入到上载文件夹

我用web2py制作了一个非常简单的单用户数据库应用程序,并将其部署到桌面计算机上。我选择web2py的原因是它的简单性和它的非侵入性web服务器

我的问题是,我需要将一个现有数据库从另一个我刚刚预处理并准备好的应用程序迁移到一个csv文件中,该文件现在可以完美地导入web2py的sqlite数据库

现在,其中一个表中的“upload”字段出现问题,对应于一个小图像,我已将该字段格式化为反csv,并使用从原始数据库中提取的相应.jpg文件的名称。问题是,我没有设法将这些文件正确地插入到上载文件夹中,因为web2py引擎会自动将用户上载的文件名更改为安全格式,而将我的文件直接复制到该文件夹是不起作用的

我的问题是,是否有人知道将此图像集合包含到上载文件夹中的正确方法?。我不知道是否有办法禁用此保护,或者是否必须手动将其名称更改为有效的哈希。我还考虑过将自动插入过程编码到数据库中的想法

谢谢大家的关注

编辑(工作示例):

示例数据库:

db.define_table('product',
                Field('name'),
                Field('color'),
                Field('picture', 'upload'),
                )
然后使用应用程序中的默认appadmin模块导入一个csv文件,其中包含以下条目:

product.name,product.color,product.picture
"p1","red","p1.jpg"
"p2","blue","p2.jpg"
然后,在我的应用程序中,我有常用的下载功能:

def download():
    return response.download(request, db)
我称之为请求上传到数据库中的图像,例如,将其包含到视图中:

<img src="{{=URL('download', args=product.picture)}}" />


因此,我的问题是,我拥有与数据库记录相对应的所有图像,我需要将它们导入到我的应用程序中,方法是将它们正确地包含在uploads文件夹中。

如果您希望通过标准web2py文件上载机制命名文件(出于安全原因,这是一个好主意)并通过内置的
response.download()
方法轻松下载,然后您可以执行以下操作

在/yourapp/controllers/default.py中:

def copy_files():
    import os
    for row in db().select(db.product.id, db.product.picture):
        picture = open(os.path.join(request.folder, 'private', row.picture), 'rb')
        row.update_record(picture=db.product.picture.store(picture, row.picture))
    return 'Files copied'
然后将所有文件放在/yourapp/private目录中,并转到URL/default/copy_文件(只需执行一次)。这将把每个文件复制到/uploads目录并重命名,将新名称存储在
db.product.picture
字段中

注意,上面的函数不必是控制器操作(尽管如果这样做,应该在完成时删除该函数)。相反,它可以是一个通过web2py命令行运行的脚本(需要在应用程序环境中运行才能访问数据库连接和模型,以及对适当的/uploads文件夹的引用)——在这种情况下,最后需要调用
db.commit()
(在HTTP请求期间不需要这样做)


或者,您可以保持原样,而不是(a)手动管理上传和下载,而不是依赖web2py的内置机制,或者(b)为
图片
字段创建
自定义存储
自定义检索
函数(不幸的是,我认为这些没有很好的文档记录),这将绕过web2py的内置存储和检索功能。不过,如果您只需完成上述一次性流程,生活可能会更轻松。

任何特定代码、输入、实际结果和预期结果?使用现有输入和预期结果的示例进行更新。谢谢。谢谢。这让我走上了正确的道路。一开始我遇到了一些问题,因为这种方法给了我以下错误:AttributeError:“Row”对象没有属性“update_record”,但是我将查询更改为:
,用于db中的行(db.product.id>0)。select():
,然后它工作得很好。此外,我还在脚本末尾添加了一个
db.commit()
,因为更改没有正确显示。很抱歉,我忘了在选择中包含
id
字段(我已使用该修复程序更新了答案)——您不必选择所有字段。关于
db.commit()
,在我的示例中,这不是必需的,但您可以正确地认为,在将代码作为脚本运行时,这是必需的。