Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python内部接口更喜欢字节还是字节?_Python_Python 3.x_File Handling_Bytesio - Fatal编程技术网

Python内部接口更喜欢字节还是字节?

Python内部接口更喜欢字节还是字节?,python,python-3.x,file-handling,bytesio,Python,Python 3.x,File Handling,Bytesio,我正试图决定在代码中使用的最佳内部接口,特别是如何处理文件内容。实际上,文件内容只是二进制数据,所以字节足以表示它们 我将文件存储在不同的远程位置,因此有两个不同的读写类。我正试图找出用于我的函数的最佳接口。最初我使用的是文件路径,但这并不理想,因为这意味着磁盘总是被使用(这意味着大量笨拙的文件) 代码中有几个区域具有相同的需求,并且将直接使用从该接口返回的任何内容。因此,无论我选择什么抽象,都会涉及到相当多的代码 使用BytesIO和bytes的各种权衡是什么 def put_file(loc

我正试图决定在代码中使用的最佳内部接口,特别是如何处理文件内容。实际上,文件内容只是二进制数据,所以字节足以表示它们

我将文件存储在不同的远程位置,因此有两个不同的读写类。我正试图找出用于我的函数的最佳接口。最初我使用的是文件路径,但这并不理想,因为这意味着磁盘总是被使用(这意味着大量笨拙的文件)

代码中有几个区域具有相同的需求,并且将直接使用从该接口返回的任何内容。因此,无论我选择什么抽象,都会涉及到相当多的代码

使用BytesIO和bytes的各种权衡是什么

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的内容时,它不会进行任何搜索
我发现使用类似文件的接口的一个优点是,它允许在检索数据时传入fp以写入。这似乎给了我们很大的灵活性

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)