Skip to main content
 首页 » 编程设计

python之如何将文件读取为多个多边形的嵌套坐标列表

2025年05月04日14yyy_WW

我有一个包含许多部分的文件,如下所示:

[40.742742,-73.993847] 
[40.739389,-73.985667] 
[40.74715499999999,-73.97992] 
[40.750573,-73.988415] 
[40.742742,-73.993847] 
 
[40.734706,-73.991915] 
[40.736917,-73.990263] 
[40.736104,-73.98846] 
[40.740315,-73.985263] 
[40.74364800000001,-73.993353] 
[40.73729099999999,-73.997988] 
[40.734706,-73.991915] 
 
[40.729226,-74.003463] 
[40.7214529,-74.006038] 
[40.717745,-74.000389] 
[40.722299,-73.996634] 
[40.725291,-73.994413] 
[40.729226,-74.003463] 
[40.754604,-74.007836] 
[40.751289,-74.000649] 
[40.7547179,-73.9983309] 
[40.75779,-74.0054339] 
[40.754604,-74.007836] 

我需要将这些部分中的每一个部分作为坐标对列表读取(每个部分由一个额外的 \n 分隔)。

在我拥有的一个类似文件中(除了没有额外的换行符外,其他文件相同),我从整个文件中绘制一个多边形。我可以使用以下代码读取坐标并在 matplotlib 中绘制它:

mVerts = [] 
with open('Manhattan_Coords.txt') as f: 
    for line in f: 
        pair = [float(s) for s in line.strip()[1:-1].split(", ")] 
        mVerts.append(pair) 
 
plt.plot(*zip(*mVerts)) 
plt.show() 

我怎样才能完成同样的任务,除了多于 1 个多边形,我的文件中的每个多边形由一个额外的换行符分隔?

请您参考如下方法:

这是我个人最喜欢的将文件“分块”为由空格分隔的内容组的方法:

from itertools import groupby 
 
def chunk_groups(it): 
     stripped_lines = (x.strip() for x in it) 
     for k, group in groupby(stripped_lines, bool): 
         if k: 
             yield list(group) 

我建议 ast.literal_eval 将列表的字符串表示形式转换为实际的 Python 列表:

from ast import literal_eval 
 
with open(filename) as f: 
     result = [[literal_eval(li) for li in chunk] for chunk in chunk_groups(f)] 

给予:

result 
Out[66]:  
[[[40.742742, -73.993847], 
  [40.739389, -73.985667], 
  [40.74715499999999, -73.97992], 
  [40.750573, -73.988415], 
  [40.742742, -73.993847]], 
 [[40.734706, -73.991915], 
  [40.736917, -73.990263], 
  [40.736104, -73.98846], 
  [40.740315, -73.985263], 
  [40.74364800000001, -73.993353], 
  [40.73729099999999, -73.997988], 
  [40.734706, -73.991915]], 
 [[40.729226, -74.003463], 
  [40.7214529, -74.006038], 
  [40.717745, -74.000389], 
  [40.722299, -73.996634], 
  [40.725291, -73.994413], 
  [40.729226, -74.003463], 
  [40.754604, -74.007836], 
  [40.751289, -74.000649], 
  [40.7547179, -73.9983309], 
  [40.75779, -74.0054339], 
  [40.754604, -74.007836]]]