我有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}")
如何让它重新读取内存文件?
答案 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'))