seek在内存文件中不起作用

时间:2017-06-28 12:15:04

标签: django django-rest-framework python-3.6

我有Django REST,我的端点接受带有attachemtn的POST。

    if serializer.is_valid():
        instance = UploadedFile.objects.create(
            file=serializer.validated_data['file'],
            username=self.request.user.get_username(),
        )

然后我把文件放到函数中。并反复循环读取此内存文件。

for pair in daterange(start_date, end_date):
    bkk_start_datetime = mom_datetime.datetime.combine(pair, mom_datetime.time(0, 0))
    bkk_end_datetime = mom_datetime.datetime.combine(pair + timedelta(days=1), mom_datetime.time(0, 0))

    ans_dict = {
        "bkk_start_datetime": bkk_start_datetime,
        "bkk_end_datetime": bkk_end_datetime,
        "pin_values": pin_values_from_file(instance, bkk_start_datetime, bkk_end_datetime)
    }
    ans.append(ans_dict)

此功能有问题,因为文件未寻找第一个位置。  虽然我放了.seek(0)

def pin_values_from_file(instance: object, start_date: datetime, end_date: datetime):
    csv_file = io.StringIO(instance.file.read().decode('utf-16'))
    csv_file.seek(0)    # Seek the first line again. Otherwise next day will be zero all
    reader = csv.reader(csv_file, dialect='excel-tab')
    count = 0
    holder = AwardHolder()
    logger.info(f"pin_values_from_file receive {start_date}, {end_date}")

如何让它重新读取内存文件?

1 个答案:

答案 0 :(得分:1)

问题不在于内存版本。想一想:你在函数中创建了内存文件,所以它总是在偏移0处。

在偏移0处的内容是instance.file。这是FieldFile的一个实例,并按照文档:

  

FieldFile.open(模式=” RB”)

     

在指定模式下打开或重新打开与此实例关联的文件。与标准的Python open()方法不同,它不返回文件描述符。

     

由于底层文件在访问时会隐式打开,因此除了重置指向底层文件的指针或更改模式外,可能无需调用此方法。

因此,虽然您不能使用搜索,因为它未实现,您可以重新打开它:

f = instance.file.open(mode='rt')
csv_file = io.StringIO(f.read().decode('utf-16'))