【问题标题】:BytesIO like file objectBytesIO 类似文件对象
【发布时间】:2018-12-01 21:52:02
【问题描述】:

我无法理解这两个 BytesIO 对象的区别。 如果我这样做:

f = open('decoder/logs/testfile.txt', 'rb')
file = io.BytesIO(f.read())
decode(file,0)

然后在解码方法中这有效:

for line in islice(file, lines, None):

但如果我像这样创建 BytesIO:

file = io.BytesIO()
file.write(b"Some codded message")
decode(file, 0)

然后在 decode 方法中循环不返回任何内容。 我的理解是 BytesIO 应该像对象一样充当文件,但存储在内存中。那么为什么当我尝试只传递一行文件时,这个循环不会像文件中没有行一样返回任何内容?

【问题讨论】:

    标签: python bytesio


    【解决方案1】:

    区别在于流中的当前位置。在第一个示例中,位置位于开头。但在第二个例子中,它在最后。可以通过file.tell()获取当前位置,通过file.seek(0)返回起点:

    import io
    from itertools import islice
    
    
    def decode(file, lines):
       for line in islice(file, lines, None):
          print(line)
    
    
    f = open('testfile.txt', 'rb')
    file = io.BytesIO(f.read())
    print(file.tell())  # The position is 0
    decode(file, 0)
    
    
    file = io.BytesIO()
    file.write(b"Some codded message")
    print(file.tell())  # The position is 19
    decode(file, 0)
    
    file = io.BytesIO()
    file.write(b"Some codded message")
    file.seek(0)
    print(file.tell())  # The position is 0
    decode(file, 0)
    

    【讨论】:

    • StringIO 也一样吗?
    【解决方案2】:
    import io
    from itertools import islice
    
    
    def decode(file, lines):
       for line in islice(file, lines, None):
          print(line)
    
    file = io.BytesIO()
    file.write(b"Some codded message")
    decode(file.getvalue(), 0)
    
    

    decode(file.getvalue(), 0)

    然后在解码方法中循环返回一些东西,不确定它是你所期望的

    decode(file.getvalue().decode('UTF8'), 0) 可能会变得更好,但并不完全是这样

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-06
      • 2015-11-19
      • 2021-02-15
      • 2021-08-28
      • 2023-03-29
      • 2022-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多