Python Flask:只需上传大文件的前 n 行,然后停止上传,继续前 n 行
Posted
技术标签:
【中文标题】Python Flask:只需上传大文件的前 n 行,然后停止上传,继续前 n 行【英文标题】:Python Flask: Just Upload the first n lines of a huge file and then stop the upload, continue with those n lines 【发布时间】:2020-05-19 14:10:16 【问题描述】:我的烧瓶 API 需要处理大文件(多个 Gb)。但是,我不需要完整的文件。我只需要文件的前 n 行,所以上传整个文件只是我的 API 的瓶颈。
目前,我正在使用FileField from flask_wtf.file。
我正在使用与此类似的代码:
@app.route('/home')
def home():
form = get_File_Field()
if form.validate_on_submit():
huge_file = form.file.data
name = secure_filename(huge_file.filename)
huge_file.save(path)
get_File_Field() 包含来自 flask_wtf 的 FileField。
有没有办法只上传 n 行然后停止上传?
【问题讨论】:
【参考方案1】:从概念上讲,您想要做的是将任务传递到后台,以便站点返回 200 响应并继续上传。通常,您会创建一个任务 ID,以便用户可以返回到 URL 并查看文件是否已完成上传、处理等。实现此目的的最常见方法是使用将数据存储在第三方软件中的任务调度程序如 RabbitMQ 或 redis。 Celery 是用于此类调度的非常常用的 Python 库。
更多详情,请查看https://flask.palletsprojects.com/en/1.1.x/patterns/celery/ 和https://blog.miguelgrinberg.com/post/using-celery-with-flask
第二个链接包含一个在 Github 上的示例实现 https://github.com/miguelgrinberg/flask-celery-example
更新:如果您的目标只是按照提问者的意见获取文件的前 N 个字节,您可以使用 read
方法来处理类似文本的文件或二进制数据。像这样:
f = open('really_big_file.dat')
# for binary data ...
# f = open("sample.bin", "rb")
head = f.read(1024)
在本例中,1024 是字节数。如果文件是 csv 或类似行结尾的文件,您可以使用此方法延迟读取文件,直到您点击“\n”,如下所示:
f = open('really_big_file.dat')
def read_part():
return f.read(1024)
output = ""
for piece in iter(read_part, ''):
lines = piece.split("\n")
if len(lines) > 1:
output += lines[0]
break
else:
output+=piece
另见Lazy Method for Reading Big File in Python?
【讨论】:
我明白你的想法,但不幸的是,这不是我想要的。我只需要一小部分文件内容。调度不会在这里做...... 如果你只得到文件的一部分,你以后如何再次得到文件的其余部分?用户会重新上传吗? 这就是重点:我不需要文件的其余部分。输入文件将具有重复的字符串格式,即 DNA 片段。在 n 行字符串之后,我的 API 拥有了它需要的所有内容,因此不需要文件的其余部分,并且完全上传这个巨大的文件会减慢整个过程【参考方案2】:我现在使用 javascript 来读取文件:Read n lines of a big text file
【讨论】:
以上是关于Python Flask:只需上传大文件的前 n 行,然后停止上传,继续前 n 行的主要内容,如果未能解决你的问题,请参考以下文章