为什么Django FieldFIle readline()返回文本文件的十六进制版本?

问题描述 投票:0回答:1

有一个奇怪的问题。

我有一个Django应用程序,它将打开一个文件(表示为Django FieldFile),并使用readline()读取每一行,如下所示:

with file.open(mode='r') as f:
  row = f.readline()
  # do something with row...

该文件是文本,采用utf-8编码,并且行以\r\n终止。

问题是每一行都以字符串的十六进制表示形式读取,因此,我得到的不是“ Hello”,而是“ 48656c6c6f”。

一些陌生的东西:

  • 它以前可以正常工作,但是在某个时候它已将其破坏(我已经尝试回滚到以前的提交,但是它仍然很不稳定,因此可能依赖项已经更新,而我的requirements.txt中没有此内容)。在我的测试中错过了它,因为它位于应用程序中很少使用的部分。

  • 如果我使用readlines()而不是readline()读取相同的文件,我会看到[b'...']中包裹的文件的正确字符串表示形式]

  • 如果我使用直接的Python open()readline()从解释程序执行此文件,则该文件将正常读取

  • 使用mode='rt'强制文本模式不会更改行为,mode='rb'

  • 该文件存储在Minio存储桶中,因此默认存储是storages.backends.s3boto3.S3Boto3Storage中的django-storages,而不是默认的Django存储类。这意味着boto3botocores3fs也处于混合状态,这使我的调试更加混乱。

  • [恼于为什么这以前起作用以及我做错了什么。

环境是在Docker容器中运行的Python 3.8,Django 2.2.8和3.0(相同的结果。)>

有一个奇怪的问题。我有一个Django应用程序,它将打开一个文件(表示为Django FieldFile),并使用readline()如下读取每一行:file.open(mode ='r')as f:row = f.readline()#。 ..

python django boto readline s3fs
1个回答
0
投票

这似乎很奇怪。我认为您尝试执行以下操作后会立即看到解决方案(如果确实无法找到答案,我会更新我的答案或将其删除,但我很有信心)

假设有一些代码,即monkeypatching file.open或django视图功能。

© www.soinside.com 2019 - 2024. All rights reserved.