在Python中读取格式化的多行

时间:2015-01-10 23:05:45

标签: python string-formatting scanf

我想在python中读取一些格式化的数据。数据的格式类似于:

00:00:00
1 1 1
1 1 1
1 1 1

00:00:02
3 3 3
3 3 3
3 3 3

我可以使用正向代码成功模拟C / C ++中的读数:

int main()
{
    string hour;
    int x0,y0,z0, x1,y1,z1, x2,y2,z2;

    while(cin >> hour)
    {
        scanf("%d %d %d\n%d %d %d\n%d %d %d\n", &x0, &y0, &z0, &x1, &y1, &z1, &x2, &y2, &z2);
        cout << hour << endl; //check the reading
    }
    return 0;
}

问题在于我找不到一些Python的方法来读取格式化的多行字符串,就像scanf一样简单。 np.genfromtxt中的一些例子接近了需要的东西,比如struct.unpack中的一些例子,但是我的技能还不足以让它适用于多行。 我可能会使用带有一些readline的split()来获得完全格式化的数据,但这让我很疯狂,因为C / C ++中的程序比Python中的程序更简单。有没有办法在Python中做类似于C / C ++代码的东西?


以下是Joril帮助后的答案:

from scanf import sscanf
import sys

data = ''
for line in sys.stdin:
    if line != '\n':
        data += line
    else:
        print sscanf(data, "%s\n%d %d %d\n%d %d %d\n%d %d %d\n")
        data = ''

作为输出我有类似的东西:

('00:00:00', 1, 1, 1, 1, 1, 1, 1, 1, 1)
('00:00:02', 3, 3, 3, 3, 3, 3, 3, 3, 3)

2 个答案:

答案 0 :(得分:2)

你绝对可以使用正则表达式。这里是python中没有循环的或多或少的匹配代码:     导入重新

hour = input()
res = re.match(
    r'(?P<hour>\d\d):(?P<minute>\d\d):(?P<second>\d\d)\n'  # \n'
    r'(?P<x0>\d+) (?P<y0>\d+) (?P<z0>\d+)\n'
    r'(?P<x1>\d+) (?P<y1>\d+) (?P<z1>\d+)\n'
    r'(?P<x2>\d+) (?P<y2>\d+) (?P<z2>\d+)',
    hour, re.MULTILINE)

if res:
    print(res.groupdict())

我会先将数据拆分成行,然后解析。

答案 1 :(得分:1)

Python FAQ说:

  

是否有scanf()或sscanf()等效?

     

不是这样。

     

对于简单的输入解析,最简单的方法通常是拆分   使用split()方法将行换成以空格分隔的单词   字符串对象,然后将十进制字符串转换为数字值   使用int()或float()。 split()支持可选的“sep”参数   如果该行使用除空格之外的其他内容,则此选项非常有用   分离器。

     

对于更复杂的输入解析,正则表达式更多   比C的sscanf()更强大,更适合任务。

但看起来有人做了一个完全符合你想要的模块:
https://hkn.eecs.berkeley.edu/~dyoo/python/scanf