Django clean:确定 TemporaryFileUploadHandler 块中的换行符

Django clean: Determine the new line character in TemporaryFileUploadHandler chunk

在上传文件的过程中,我需要将其内容分成几行,计算每行的字符数,如果超过一定长度则引发错误。

class TheModel(models.Model):
    upload_file = models.FileField(
        upload_to='the/path'
    )


class TheForm(forms.ModelForm):
    def clean_upload_file(self):
        the_file = self.cleaned_data.get('upload_file')
        if the_file:
            for chunk in upload_file.chunks():  # the file is huge
                import ipdb; ipdb.set_trace()

the_filerb+模式打开。当前部分内容为:

>>>print(chunk)
b' counterproductive\nbishop\nsa raindrop\nsangu'
>>>print(the_file.mode)
'rb+'

很明显,字节的结尾是新行的开始,将在下一次迭代中继续。

>>>print(chunk.splitlines())
[b' counterproductive', b'bishop', b'sa raindrop', b'sangu']

上述方法无法判断最后一个条目是否为整行。另一方面,\n 不保证是二进制模式下每个上传文件的行分隔符。

如果换行符不同(例如可能是 \n\r\n),我如何区分列表的最后一个条目是表示一行的结尾还是只是第一个新的一部分?

如果数据大于默认的 2.5 兆字节,

UploadedFile.multiple_chunks() 可以删除 splitlines() 提供的列表的第一个和最后一个条目。

validation_list = (
    chunk.splitlines()[1:len(chunk.splitlines())-1] 
    if the_file.multiple_chunks()
    else chunk.splitlines()
)

这样,在这个初步检查中,只跳过了几十万行中的一小部分,保持了非常低的丢失率。这比冒着误报的风险来验证一条线,通过从迭代之间散布的可能块中重建它的努力来验证它可能与原始线不同。