我在S3中存储了一个文本文件,需要在Python程序中使用该文本文件的内容。
对于Read a file line by line from S3 using boto?,我可以使用boto3
获取其内容:
import boto3
s3 = boto3.resource('s3')
object = s3.Object('my-bucket','my-key')
file_lines = [line.decode('utf-8') for line in object.get()['Body'].iter_lines()]
这看起来可行,但是我硬编码了编码方法utf-8
。属性object.contents_encoding
是None
。
我应该使用什么样的内容解码方法,还是我误解了如何将字节中的数据转换为文本?
1条答案
按热度按时间slmsl1lt1#
当文件上传到S3时,文件的二进制表示存储在S3中。S3不知道它包含什么。如果文件上传时添加了
charset
field in theContent-Type
header,看起来像text/plain; charset=utf-8
,那么您可以假设对象的内容是使用指定的编码进行编码的。由于许多原因,此标头仅供参考。一些客户端会忽略它,并做出自己的假设。S3不会验证所使用的编码,这意味着它可能是错误的。如果没有这个头,那么就不能保证所使用的内容编码,如果您不知道通过其他方式使用的内容编码,那么您就需要猜测。
你如何猜测取决于你的具体情况。通常使用charset detection algorithm的某个版本,比如Firefox使用的Mozilla's Charset Detector,或者Chromium使用的Google's Compact Enc Dec。当使用Python时,一个解决方案是使用chardet,这是Mozilla解决方案的Python移植。或者,一些解决方案会假设它是用UTF-8编码的,并且在出错时失败,这完全取决于具体的场景,以及您希望有多宽松,以及在目标情况下遇到不同编码的可能性有多大。