我想知道如何通过请求来发布一个fastq文件python对象。
from Bio import SeqIO
seqs = SeqIO.parse("/path/to/seqfile.fastq", "fastq")
我使用Bio来解码一个fastq文件,我想先发送整个fastq文件,然后在服务器端创建对象,或者在服务器端发布对象并解码对象。我想发送整个fastq文件,然后在服务器端创建对象,或者,发布对象并在服务器端解码对象。
最好是发送整个fastq文件,我知道对于一个文本文件你会这样做。
files = {'upload_file': ('foobar.txt', open('file.txt','rb'), 'text/x-spam')}
r = requests.post(url, files=files)
所以基本的问题是,fastq文件的头是什么?
比如,text : 'textx-spam', json : 'applicationjson'等。
你运行什么可以给你 AttributeError
评论中提到的?
从你的问题中并不完全清楚你是否正在这样做,但你不应该尝试上传结果的。SeqIO.parse
作为一个文件。这将返回一个文件对象的迭代器,如果你想通过HTTP以JSON格式发送对象,你可以用自定义的JSON编码器解码器对其进行序列化和解码。
另外,你也可以在上传中直接发送文件的文本内容,然后使用文本封装器将其保存到磁盘中,并使用Biopython进行解析。
一个Flask端点的例子,它接受一个FASTQ文件,然后用一个 StringIO
包装器将是。
from io import StringIO
from flask import Flask, request
from Bio import SeqIO
app = Flask(__name__)
@app.route('/', methods=['POST'])
def simple_upload():
if request.method == 'POST':
if 'file' not in request.files:
print('No file part')
return 'Error', 500
file = request.files['file']
if file.filename == '':
print('No selected file')
return 'Error', 500
if file:
for s in SeqIO.parse(StringIO(file.read().decode('utf-8')), 'fastq'):
print(s.id)
print(file.content_type)
return 'OK', 200
如果你运行。
import requests
files = {'file': ('my_test_file.fastq', open('my_test_file.fastq', 'rb'), 'text/plain')}
url='http://127.0.0.1:5000/'
r = requests.post(url, files=files)
那么你的服务器端就会成功地打印出你上传的文件中的序列ID。
这只是一个简单的概念验证,你可以对上传的文件做任何你想做的事情--保存到磁盘,处理内容,显示内容等等。