我想在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)
答案 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)
是否有scanf()或sscanf()等效?
不是这样。
对于简单的输入解析,最简单的方法通常是拆分 使用split()方法将行换成以空格分隔的单词 字符串对象,然后将十进制字符串转换为数字值 使用int()或float()。 split()支持可选的“sep”参数 如果该行使用除空格之外的其他内容,则此选项非常有用 分离器。
对于更复杂的输入解析,正则表达式更多 比C的sscanf()更强大,更适合任务。
但看起来有人做了一个完全符合你想要的模块:
https://hkn.eecs.berkeley.edu/~dyoo/python/scanf