有一个奇怪的问题。
我有一个Django应用程序,该应用程序打开一个文件(表示为Django FieldFile
),并使用readline()
读取每一行,如下所示:
with file.open(mode='r') as f:
row = f.readline()
# do something with row...
该文件为文本,采用utf-8编码,行以\r\n
结尾。
问题是每一行都以字符串的十六进制表示形式读取,所以我得到的不是“ Hello”,而是“ 48656c6c6f”。
一些奇怪的事情:
-
它以前可以正常运行,但是在某个时候它已将其破坏(我尝试回滚到以前的提交,但它仍然很不稳定,因此可能依赖项已经更新,而我的{{1 }}。在我的测试中错过了它,因为它在应用程序中很少使用。
-
如果我使用
requirements.txt
而不是readlines()
读取相同的文件,则会看到包裹在readline()
中的文件的正确字符串表示形式 -
如果我使用解释器中的直接Python
[b'...']
和open()
来正常读取文件 -
使用
readline()
强制文本模式不会更改行为,mode='rt'
-
文件存储在Minio存储桶中,因此默认存储是
mode='rb'
中的storages.backends.s3boto3.S3Boto3Storage
,而不是默认的Django存储类。这意味着django-storages
,boto3
和botocore
也在混合中,这使我的调试更加混乱。
抓狂地研究为什么这以前起作用以及我做错了什么。
环境是在Docker容器中运行的Python 3.8,Django 2.2.8和3.0(结果相同)。
编辑
让我指出,对此的解决方法只是使用
s3fs
但是我仍然想知道发生了什么事。
编辑2
此外,FieldFile.open()将文件读取为二进制文件,而普通的Python open()将文件读取为文本文件。