Python内部接口更喜欢字节还是字节?
我正试图决定在代码中使用的最佳内部接口,特别是如何处理文件内容。实际上,文件内容只是二进制数据,所以字节足以表示它们 我将文件存储在不同的远程位置,因此有两个不同的读写类。我正试图找出用于我的函数的最佳接口。最初我使用的是文件路径,但这并不理想,因为这意味着磁盘总是被使用(这意味着大量笨拙的文件) 代码中有几个区域具有相同的需求,并且将直接使用从该接口返回的任何内容。因此,无论我选择什么抽象,都会涉及到相当多的代码 使用BytesIO和bytes的各种权衡是什么Python内部接口更喜欢字节还是字节?,python,python-3.x,file-handling,bytesio,Python,Python 3.x,File Handling,Bytesio,我正试图决定在代码中使用的最佳内部接口,特别是如何处理文件内容。实际上,文件内容只是二进制数据,所以字节足以表示它们 我将文件存储在不同的远程位置,因此有两个不同的读写类。我正试图找出用于我的函数的最佳接口。最初我使用的是文件路径,但这并不理想,因为这意味着磁盘总是被使用(这意味着大量笨拙的文件) 代码中有几个区域具有相同的需求,并且将直接使用从该接口返回的任何内容。因此,无论我选择什么抽象,都会涉及到相当多的代码 使用BytesIO和bytes的各种权衡是什么 def put_file(loc
def put_file(location, contents_as_bytes):
def put_file(location, contents_as_fp):
def get_file_contents(location):
def get_file_contents(location, fp):
我发现,在seek(0)
等方面,使用类似文件的接口(BytesIO等)需要一些管理开销,这会引发如下问题:
- 在开始之前还是在完成之后查找更好
- 您是从文件所在的位置开始查找,还是仅从文件所在的位置开始操作
- 你应该
来保持这个位置吗tell()
- 查看类似于
shutil.copyfileobj的内容时,它不会进行任何搜索
def get_file_contents(location, write_into=None):
if not write_into:
write_into = io.BytesIO()
# get the contents and put it into write_into
return write_into
get_file_contents('blah', file_on_disk)
get_file_contents('blah', gzip_file)
get_file_contents('blah', temp_file)
get_file_contents('blah', bytes_io)
new_bytes_io = get_file_contents('blah')
# etc
在python中设计接口时,是否有充分的理由选择BytesIO而不是只使用固定字节?io.BytesIO对象的好处是它们实现了一个公共ish接口(通常称为“类似文件”的对象)
BytesIO
对象有一个内部指针(其位置由tell()
返回),每次调用read(n)
时,指针向前移动n
字节。前
import io
buf = io.BytesIO(b'Hello world!')
buf.read(1) # Returns b'H'
buf.tell() # Returns 1
buf.read(1) # Returns b'e'
buf.tell() # Returns 2
# Set the pointer to 0.
buf.seek(0)
buf.read() # This will return b'H', like the first call.
在您的用例中,bytes
对象和io.BytesIO
对象可能不是最好的解决方案。他们会将文件的完整内容读入内存
相反,您可以查看
tempfile.TemporaryFile
()。谢谢您的输入。我最终使用了字节和类似文件的对象的组合。tempfile的优点是:使用类似文件的对象可以在需要时灵活地使用tempfile,这可以为某些用例提供更好的时间/空间权衡。最后一个buf.read()
将返回整个字符串。如果省略size
arg或使用负值,它将一直读取到EOF。我想你的意思是buf.read(1)
。