我有一个包含无法使用数据的存档,我想用python清理它们。
首先,这些行的形式为:
Xac:0.01660156#,Yac:0.02343750?,Zac:1.00683593*
我想删除:Xac:
,Yac:
和Zac:
,以及#
,?
,{等数字末尾的字符{1}}只留下数字。
另外,我想删除档案中的一些垃圾行:
*
存档中的那些行对我来说是垃圾,我需要删除它们以留下一个只有三列数字的干净存档。 (实际上,这些数字是!Data Logger Accelerometer] ,
Initializing...
,x
和y
轴上的加速度计读数,但我有无法使用的数据,如上所示。)
我怎样才能做到这一点?
答案 0 :(得分:0)
你可以使用python正则表达式。
import re
x = 'Xac:0.01660156#,Yac:0.02343750?,Zac:1.00683593*'
print re.findall('(\d*\.?\d+)', x) #['0.01660156', '0.02343750', '1.00683593']
答案 1 :(得分:0)
您需要解析数据文件。
首先,跳过无效行:
if not line.startswith('Xac:'):
return None
其次,由非数字字符分开:
parts = re.split('[,Xac:YZ#?*]', line)
第三,过滤空strs:
parts = filter(lambda x: bool(x), parts)
第四,隐蔽str
到float
:
parts = map(lambda x: float(x), parts)
最后,将list
转换为tuple
return tuple(parts)
完整的例子是这样的:
import re
def parse_line(line):
""" line -> (int, int, int), None if invalid
"""
if not line.startswith('Xac:'):
return None
parts = re.split('[,Xac:YZ#?*]', line)
parts = filter(lambda x: bool(x), parts)
parts = map(lambda x: float(x), parts)
return tuple(parts)
output = []
with open('input.txt') as f:
for line in iter(f.readline, ''):
axes = parse_line(line.strip())
if axes:
output.append(axes)
print output
输入文件input.txt
:
!Data Logger Accelerometer] ,
Initializing...
Xac:0.01660156#,Yac:0.02343750?,Zac:1.00683593*
输出:
[(0.01660156, 0.0234375, 1.00683593)]