我在管理一些以非常糟糕的格式保存的数据时遇到了问题。
我有对应多边形边的点的数据。每个多边形的数据用字符串>
分隔,而点的x
和y
值用不统一的标准分隔,有时用若干空格分隔,有时用若干空格和表格分隔。我尝试用以下代码将这些数据加载到数组的数组中:
f = open('/Path/Data.lb','r')
data = f.read()
splat = data.split('>')
region = []
for number, polygon in enumerate(splat[1:len(splat)], 1):
region.append(float(polygon))
但我一直得到一个错误,试图运行float()
功能(我已经削减它,因为它更长):
ValueError: could not convert string to float: 'n -73.311 -48.328n -73.311 -48.326n -73.318 -48.321n ...
... -73.324t -48.353n -73.315t -48.344n -73.313t -48.337n'
是否有一种方法可以将数据转换为浮动而不修改源文件?如果没有,是否有一种方法可以轻松地修改源文件,以便以相同的方式分隔所有列?我想这样同样的代码应该运行得很流畅。
谢谢!
尝试:
with open("PataIce.lb", "r") as file:
polygons = file.read().strip(">").strip().split(">")
region =[]
for polygon in polygons:
sides = polygon.strip().split("n")
points = [[float(num) for num in side.split()[:2]] for side in sides]
region.append(points)
有些点包含两个以上的值,在这种情况下,我限制脚本只读取前两个数字。
可以使用正则表达式匹配十进制数
import re
PATH = <path_to_file>
coords = []
with open(PATH) as f:
for line in f:
nums = re.findall('-?d+.d+', line)
if len(nums) >0:
coords.append(nums)
print(coords)
注意:这个解决方案忽略了某些行末尾的0。请注意,coords
中的结果仍然是字符串。您需要使用float()
将它们转换为浮动。
In [79]: astr = 'n -73.311 -48.328n -73.311 -48.326n -73.318 -48.321n -73.324
...: t -48.353n -73.315t -48.344n -73.313t -48.337n'
In [80]: lines =astr.splitlines()
In [81]: lines
Out[81]:
['',
' -73.311 -48.328',
' -73.311 -48.326',
' -73.318 -48.321',
' -73.324t -48.353',
' -73.315t -48.344',
' -73.313t -48.337']
splitlines
处理n
分隔符;split()
处理制表符和空格
In [82]: [line.split() for line in lines]
Out[82]:
[[],
['-73.311', '-48.328'],
['-73.311', '-48.326'],
['-73.318', '-48.321'],
['-73.324', '-48.353'],
['-73.315', '-48.344'],
['-73.313', '-48.337']]
初始[]
需要以某种方式删除:
In [84]: np.array(Out[82][1:], dtype=float)
Out[84]:
array([[-73.311, -48.328],
[-73.311, -48.326],
[-73.318, -48.321],
[-73.324, -48.353],
[-73.315, -48.344],
[-73.313, -48.337]])
仅当每个line
具有相同数量的元素时才有效,其中2。只要Out[82]
中的字符串列表足够干净,就可以让np.array
进行从字符串到浮点数的转换。
您的实际文件可能需要一些进一步的处理,但这应该给您一个基本的概念。