2015-01-10 71 views
2

我想阅读一些Python中的格式化数据。该数据的格式类似于这样:阅读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) 

回答

1

Python FAQ说:

是有一个scanf()或sscanf()等效?

不一样。

对于简单的输入解析,最简单的方法通常是使用 字符串对象的分割()方法来拆分 线成空格分隔的单词,然后使用INT()或浮动小数字符串转换为数字值 ( )。 split()支持可选的“sep”参数 ,如果该行使用非空白字符作为 分隔符,则该参数非常有用。

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

但它看起来像一个人做了一个模块,不正是你想要什么:
https://hkn.eecs.berkeley.edu/~dyoo/python/scanf

+0

工作就像一个魅力!非常感谢! – Ziul

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()) 

我首先分裂成数据线,然后解析虽然。

+0

这很好,但我选择了[Joril's](http://stackoverflow.com/users/3497/joril),因为它更类似于C/C++代码。 – Ziul

+0

@Ziul你怎么样? ) –

+0

= D会upvote,但没有足够的声誉。 – Ziul