gpt4 book ai didi

python - 函数获取二进制文件/流/文件名并将它们转换为可读文本格式的适当参数/返回类型是什么?

转载 作者:行者123 更新时间:2023-11-28 18:39:08 24 4
gpt4 key购买 nike

我有一个函数,旨在采用二进制文件格式并将其转换为可读的文本格式,例如:

def textualize(binary_stuff):
# magic to turn binary stuff into text
return text_stuff

有几种不同的类型我可以接受作为输入或生成作为输出,但我不确定要使用什么。以下是我能想到的一些选项和相应的反对意见:

  1. 将一个字节对象作为输入并返回一个字符串。
    • 如果输入来自现在必须读入内存的大文件,就会有问题。
  2. 将一个类似文件的对象作为输入,读取它,并返回一个字符串。
    • 依赖调用者以正确的模式打开文件。
    • 这种不对称让我感到不安,原因我也说不清。
  3. 拿两个类似文件的对象;从一个读取并写入另一个而不是返回任何东西。
    • 再次依赖调用者以正确的模式打开文件。
    • 使最常见的情况(命名文件到命名文件,或字节到字符串)比它们需要的更加笨拙。
  4. 取两个文件名并自己处理打开内容。
    • 如果调用者想要转换不在指定文件中的数据怎么办?
  5. 接受多种可能的输入类型。
    • 编程可能很复杂。
    • 仍然留下返回什么的问题。

对于这样的转化,是否有既定的正确做法?我是否缺少其他权衡?

最佳答案

您可以像 json 模块那样做。一个函数用于字符串,另一个函数用于文件。并将文件的打开和关闭留给调用者——给调用者更多的灵 active 。然后,您可以使用 functools.singledispatch 提供调度函数的方法

例如。

from functools import singledispatch
from io import BytesIO, StringIO, IOBase, TextIOBase

@singledispatch
def textualise(input, output):
if not isinstance(input, IOBase):
raise TypeError(input)
if not isinstance(output, TextIOBase):
raise TypeError(output)
data = input.read().decode("utf-8")
output.write(data)
output.flush()

@textualise.register(bytes)
def textualise_bytes(bytes_):
input = BytesIO(bytes_)
output = StringIO()
textualise(input, output)
return output.getvalue()

@textualise.register(str)
def textualise_filenames(in_filename, out_filename):
with open(in_filename, "rb") as input, open(out_filename, "wt") as output:
textualise(input, output)

s = textualise(b"some text")
assert s == "some text"

textualise("inputfile.txt", "outputfile.txt")

我个人会避免使用第三种形式,因为 bytes 对象也是有效的文件名。例如,textualise(b"inputfile.txt", "outputfile.txt") 会被分派(dispatch)到错误的函数 (textualise_bytes)。

关于python - 函数获取二进制文件/流/文件名并将它们转换为可读文本格式的适当参数/返回类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28889993/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com