Skip to main content
 首页 » 编程设计

python之如何在自定义 Django 上传处理程序中逐行读取

2025年04月02日28sky-heaven

我正在处理大 SDF files (~多个 GB)并想要计算每个分子中的分子数并将其存储在数据库中。现在,我在文件上传后将它作为一个单独的循环来执行,但这意味着要额外迭代一次文件,这需要很长时间,并且是在文件上传后完成的,因此不会向用户提供任何进度信息。

我的计划是在自定义上传处理程序中计算等于:$$$$ 的行数,然后将该数字以某种方式放在模型上并保存模型。不过,我对 Python 还是很陌生,当我意识到我得到了一大块数据并且找不到从上传中逐行读取的好方法时,我完全被难住了。 Django 中是否已经有一些 Handler 可以逐行读取我可以使用或者我必须自己制作?如果我必须自己制作,考虑到总数据量很大,我应该使用哪种数据结构作为本地缓存以使其在我的处理程序中保持快速?

这是我目前所拥有的::)

class CountSDFEntries(FileUploadHandler): 
    def receive_data_chunk(self, raw_data, start): 
        return raw_data 
 
    def file_complete(self, file_size): 
        return None 

请您参考如下方法:

我最终得到了这段代码:

class CountSDFEntries(FileUploadHandler): 
 
    def __init__(self, request, datasetModel): 
        FileUploadHandler.__init__(self, request) 
        self.datasetModel = datasetModel 
 
    cache = "" 
    numofmols = 0 
    datasetModel = None; 
 
    def receive_data_chunk(self, raw_data, start): 
        self.cache += raw_data 
        lines = self.cache.splitlines() 
        self.cache = lines[-1] 
        del lines[-1] 
        for line in lines : 
            if line.rstrip() == "$$$$": 
                self.numofmols += 1 
        return raw_data 
 
    def file_complete(self, file_size): 
        #The last line is still in the cache, so + 1 
        self.datasetModel.numberOfMols = self.numofmols + 1  
        return None 

但是,文件上传后还有很长的等待时间,我现在想知道是否可能是 Django 将文件从 /tmp/ 移动到文件应该在的位置结束。所以这并没有真正解决我在文件上传后等待时间过长的问题。 :(