在Python中将字符串转换为多维数组



我在管理一些以非常糟糕的格式保存的数据时遇到了问题。

我有对应多边形边的点的数据。每个多边形的数据用字符串>分隔,而点的xy值用不统一的标准分隔,有时用若干空格分隔,有时用若干空格和表格分隔。我尝试用以下代码将这些数据加载到数组的数组中:

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进行从字符串到浮点数的转换。

您的实际文件可能需要一些进一步的处理,但这应该给您一个基本的概念。

相关内容

  • 没有找到相关文章

最新更新