gpt4 book ai didi

Python 流提取

转载 作者:太空狗 更新时间:2023-10-30 01:16:16 24 4
gpt4 key购买 nike

许多编程语言的标准库都包含一个“扫描器 API”,用于从文本输入流中提取字符串、数字或其他对象。 (例如,Java 包含Scanner 类,C++ 包含istream,C 包含scanf)。

这在 Python 中相当于什么?

Python 有一个流接口(interface),即继承自 io.IOBase 的类。然而,Python TextIOBase 流接口(interface)只提供面向行的输入。在reading the documentation之后和 searching on Google ,我在标准 Python 模块中找不到可以让我从文本流中提取整数或将下一个以空格分隔的单词提取为字符串的东西。是否有任何标准设施可以执行此操作?

最佳答案

fscanf 或 Java 的 Scanner 没有等效项。最简单的解决方案是要求用户使用换行符分隔输入而不是空格分隔输入,然后您可以逐行读取并将行转换为正确的类型。

如果您希望用户提供更结构化的输入,那么您可能应该为用户输入创建一个解析器。有一些不错的 python 解析库,例如 pyparsing .还有一个scanf模块,即使最后一次更新是 2008 年。

如果你不想有外部依赖,那么你可以使用正则表达式来匹配输入序列。当然,正则表达式需要处理字符串,但您可以轻松地克服这种分块读取的限制。例如,像这样的东西在大多数情况下应该运行良好:

import re


FORMATS_TYPES = {
'd': int,
'f': float,
's': str,
}


FORMATS_REGEXES = {
'd': re.compile(r'(?:\s|\b)*([+-]?\d+)(?:\s|\b)*'),
'f': re.compile(r'(?:\s|\b)*([+-]?\d+\.?\d*)(?:\s|\b)*'),
's': re.compile(r'\b(\w+)\b'),
}


FORMAT_FIELD_REGEX = re.compile(r'%(s|d|f)')


def scan_input(format_string, stream, max_size=float('+inf'), chunk_size=1024):
"""Scan an input stream and retrieve formatted input."""

chunk = ''
format_fields = format_string.split()[::-1]
while format_fields:
fields = FORMAT_FIELD_REGEX.findall(format_fields.pop())
if not chunk:
chunk = _get_chunk(stream, chunk_size)

for field in fields:
field_regex = FORMATS_REGEXES[field]
match = field_regex.search(chunk)
length_before = len(chunk)
while match is None or match.end() >= len(chunk):
chunk += _get_chunk(stream, chunk_size)
if not chunk or length_before == len(chunk):
if match is None:
raise ValueError('Missing fields.')
break
text = match.group(1)
yield FORMATS_TYPES[field](text)
chunk = chunk[match.end():]



def _get_chunk(stream, chunk_size):
try:
return stream.read(chunk_size)
except EOFError:
return ''

示例用法:

>>> s = StringIO('1234 Hello World -13.48 -678 12.45')
>>> for data in scan_input('%d %s %s %f %d %f', s): print repr(data)
...
1234
'Hello'
'World'
-13.48
-678
12.45

您可能必须扩展它并正确测试它,但它应该会给您一些想法。

关于Python 流提取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14905866/

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