我有一个text / csv文件,其中包含如下所示的行:
05:21:20PM Driving 46 84.0 Some Road; Some Ext 1; in SomePLace; Long 38 12 40.6 E Lat 29 2 47.2 S
还有其他行包含我不追求的数据。
我只想提取时间戳,然后提取LatLong。
我感兴趣的行中唯一不变的是开头的timstamp,总是8个字符长,以PM或AM结束,然后以“Long”开头的Lat / Long结束在“S”中。
有没有办法可以运行这个文件,只删除这两个文本,将它们连接成一个新行,并忽略所有其他没有时间戳的行作为第一个条目和Lat / Long部分结尾(某些行的开头有时间戳但不是纬度/长度)
答案 0 :(得分:1)
使用csv
模块解析行,然后拆分;
上的最后一列以获取纬度/经度坐标:
with open(inputfilename, 'rb') as inputfh:
reader = csv.reader(inputfh, delimiter='\t')
for row in reader:
timestamp = row[0]
lat_long = row[2].rpartition(';')[-1].strip()
这假定文件是以制表符分隔的,并且latitute / longitude条目始终是第3列中的最后;
分号分隔值
答案 1 :(得分:1)
如果您的数据是 CSV 格式,我建议您不要使用正则表达式,因为这不是很漂亮,正则表达式是 CSV 的错误工具。但由于您的数据看起来不像真正的 CSV 格式,因此使用正则表达式解析它可能是一个选项,此代码对您提供的示例起作用:
import re
with open('inputfilename', 'rU') as f:
for line in f:
mat = re.match("(\d+):(\d+):(\d+)([AP]M).*Long\s+([^EW]+[EW]).*Lat\s+([^NS]+[NS])", line)
if mat is not None:
print mat.groups()
结果:
('05', '21', '20', 'PM', '38 12 40.6 E', '29 2 47.2 S')
此结果的进一步处理留作练习,但它可能如下所示:
hour, minute, second, am_pm, long, lat = mat.groups()
答案 2 :(得分:0)
>>> s = "05:21:20PM Driving 46 84.0 Some Road; Some Ext 1; in SomePLace; Long 38 12 40.6 E Lat 29 2 47.2 S"
>>> date = s.split(" ")[0]
>>> date
'05:21:20PM'
>>> long_start = "Long"
>>> lat_start = "Lat"
>>> longtitude = s[s.find(long_start) + len(long_start): s.find(lat_start)]
>>> longtitude
' 38 12 40.6 E '
>>> latitude = s[s.find(lat_start) + len(lat_start):]
>>>
>>> latitude
' 29 2 47.2 S'
>>> latitude = s[s.find(lat_start) + len(lat_start):].strip()
>>> latitude
'29 2 47.2 S'
>>>