【问题标题】:Python scanf-like input [duplicate]Python scanf-like输入[重复]
【发布时间】:2014-12-30 11:59:50
【问题描述】:

编辑: 我最终查找了我是“重复”问题的解决方案,并制作了以下 sn-p 代码:

import sys
from collections import deque

_input=deque([])

def read_word():
    global _input
    while len(_input)==0:
        line=sys.stdin.readline().split()
        for word in line:
            _input.append(word)
    return _input.popleft()

def read_int():
    return int(read_word())

原始问题:

我想用 Python 编写一些从标准输入读取输入的程序。但是输入处理让我很生气——我没有看到一种很好的方法来扫描没有很好地对齐行的数据。 例如,如果我必须扫描一个整数 N,然后处理 N 个单词,在 C++ 中我会这样做:

int N;
char str[100];
scanf("%d",&N);
for(int i=0;i<N;i++){
    scanf("%s",str);
    //do stuff with str
}

此程序将以完全相同的方式扫描以下所有输入:

//input 1:
3 word1 word2 word3
//input 2:
3
word1 word2 word3
//input 3:
3
word1
word2
word3
//input 4:
3 word1 word2
word3

我喜欢类似于 C 的 scanf 赋予我的灵活性,我也希望在 Python 中看到类似的东西。我不能使用 input(),因为它会尝试将字符串解析为 Python 语法(可能以字典或类似的东西结尾),并且 raw_input() 在换行符结束的行上运行。函数 sys.stdin.read() 也不好,因为它会等到给出整个输入(我可能想实时显示部分结果)。我看到实现这种功能性的唯一方法是在循环中使用 sys.stdin.readline() ,尝试独立解析每一行,直到解析所有需要的单词。但这不是很优雅的解决方案,它也有一些缺陷 - 例如,如果上面提到的示例程序在其进一步的操作中应该输入更多的东西,并且这个单词或数字与最后一个单词在同一行给出, Python 程序无法正确解析它。

有问题的输入是:

//input 5:
3 word1 word2
word3 next_input

“next_input”这个词会被 readline() 函数“吞下”,即使以后的程序可能需要它。同样,这可以通过提供 input_yet_to_be_parsed_but_already_inputted 的临时缓冲区来解决,但它很快就会变成非常错误的代码。有没有真正的“pythonic”方式来做到这一点?还是我遗漏了一些明显的东西?

【问题讨论】:

  • “在 C++ 中我会这样做”——那不是 C++……那是 C。
  • 好的,但是在 C++ 中无论如何都有cin&gt;&gt;a&gt;&gt;b; 语法,它一次只扫描一个单词,所以问题仍然有效。

标签: python scanf


【解决方案1】:

为什么不将re 模块用于正则表达式?

您的示例将被映射到这样的正则表达式:

>>> pattern = re.compile(r'^(\d)*')
>>> pattern.match('3 word1').group(1)
'3'

如果您需要其余数据以供以后使用,是否将其作为第二组?

>>> pattern = re.compile(r'^(\d)*(.*)')
>>> match = pattern.match('3 lol')
>>> "matched: " + match.group(1) + ", rest: " + match.group(2)
'matched: 3, rest:  lol'

【讨论】:

  • 好的,但是如何首先从标准输入获取输入呢?我希望您具体解决最后一个问题(输入 5)
  • @akrasuski1 ,请参阅编辑,正则表达式可能会随着输入变得更复杂而变得更复杂,但我记得scanf 也具有该属性。您可以通过最后匹配来访问数据的“其余部分”。
  • pattern.match('3 word1').group(1) 返回字符串'3',这与scanf("%d",&amp;N); 从标准输入读取并将整数值存储到整数变量N 中几乎不一样。
  • 虽然从技术上讲它可以实现,但它很容易导致不可读的代码——如果我有自己读取输入的函数怎么办?我是否必须将临时缓冲区作为参数传递给他们?我是否必须将更新的临时缓冲区返回给调用者?感谢您的回复,但我认为这不是一个可以接受的解决方案。 @martineau - 这不是一个大问题,因为我总是可以通过输入 int(x) 来进行转换。问题在于将输入划分为单词,如果您不知道它们在行中的分布
猜你喜欢
  • 2013-12-30
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
  • 2012-11-02
相关资源
最近更新 更多