使用Python从txt文件加载矩形数据?

时间:2015-06-02 05:30:02

标签: python import rectangles

我在txt文件中有与图像相关的矩形数据 每行用于差异图像 第一列是图像编号。

8 17 30 70 80
9 49 25 72 83
10 13 21 75 82    74 25 16 21

每一行用于由以下表示的矩形:
img_number lefttopcorner.Xcoord lefttopcorner.Ycoord width height
与图像相关联 这些数据是空间分隔的。 第三行显示此图像有两个矩形,但可能有很多。

同一行上的矩形以制表符分隔。
因此,同一行上的两个矩形的书面示例如下: img_num<space>lefttopcorner.X<space>lefttopcorner.Y<space>width<space>height<tab>...
我如何将这些矩形加载到python中的变量并将它们放入一些集合结构中。
也许有平行的元组数组或rectangles?我正在寻找最简单的实现。

6 个答案:

答案 0 :(得分:3)

最简单的实现是dictionary,其中行号为键,[[x,y,w,h]]为该键的值。如果同一行上的多个矩形用制表符分隔,您将获得键为[[x1,y1,w1,h1], [x2,y2,w2,h2]]

rectangles = {}
with open("sample.txt", "r") as rects:
    for rect in rects:
      rectangles[int(rect.split()[0])] = [map(int, rect.split()[1:][i:i+4]) for i in range(0, len(rect.split()[1:]), 4)]

    print rectangles

<强>输出:

{8: [[17, 30, 70, 80]], 9: [[49, 25, 72, 83]], 10: [[13, 21, 75, 82], [74, 25, 16, 21]]}

要从rectangles词典中检索相关数据,您可以使用:

row_number = 8
for rect in rectangles[8]: #Accessing a specific row
    print rect, #Will print multiple rectangles if present.

或者检索所有数据:

for key in rectangles:
    print rectangles[key]

答案 1 :(得分:2)

撰写class Rectangle并使用dictionary包含它,如下所示。

class Rectangle:
    def __init__(self, number, x, y, width, height):
        self.img_number = number
        self.x = x
        self.y = y
        self.width = width
        self.height = height
    def __str__(self):
        return "IMG_NUMBER {0}; lefttopcorner.X {1}; lefttopcorner.Y {2}; width {3}; height {4}".format(self.img_number,
                                                                self.x, self.y,
                                                                self.width, self.y)

rectangles = {}
with open("1.txt") as f:
    for data in f.readlines():

        data = data.split()[:5] #get first rectangle if lines wrong like 10 13 21 75 82    74 25 16 21 22
                                #It simple way, but good for concept demonstration
        rectangle = Rectangle(data[0], data[1], data[2], data[3], data[4])
        rectangles[data[0]] = rectangle #Add rectangle to container
for i in rectangles:
    print i, ":", rectangles[i]

测试它:

9 : IMG_NUMBER 9; lefttopcorner.X 49; lefttopcorner.Y 25; width 72; height 25
8 : IMG_NUMBER 8; lefttopcorner.X 17; lefttopcorner.Y 30; width 70; height 30
10 : IMG_NUMBER 10; lefttopcorner.X 13; lefttopcorner.Y 21; width 75; height 21

答案 2 :(得分:0)

我总是先考虑我的数据模型。在这里,您可能会有一个字典,图像编号为关键字,矩形列表为值。每个矩形可以是一个Rectangle对象(供您实现)。

您也可以将解析分成几部分,从处理每一行开始:

    image_number, rects = line[0], line[1:]

然后解析你的rects,更好地在另一个函数中,将rects作为参数,提取4乘4的值,将它们提供给Rectangle对象的构造函数。最后,您的矩形对象必须以正确的顺序将4个值放入4个命名成员中。

是的,你必须实现Rectangle及其ctor。您可以选择使用4个整数的元组而不是Rectangle类,这取决于您。

Anoter存储的想法可能是拥有一个Image类,在其构造函数中取rects,并保持矩形列表。因此,您的dict将image_number存储为键,将Image存储为值。

这样,您就可以实现Image.draw(),可以访问self.rectangles。

答案 3 :(得分:0)

with open('path/to/file') as infile:
    for line in infile:
        data = [int(i) for i in line.split()]
        if len(data) == 5:
            imageNum = data[0]
            data.pop(0)
        x,y, width,height = data
        print("Rectangle", imageNum, "starts at coordinates (", x,y, ") and has width", width, "and has height", height)

答案 4 :(得分:-2)

with read("<filename>.txt", "r"):
     content = f.read() # may need to do something smarter is the file is big; this reads everything in memory
content = content.replace("\t", "\n")
lines = content.split("\n")
for line in lines:
    rect = map(int, line.split())

答案 5 :(得分:-2)

我会使用元组列表字典。

images = {
  8 : [(17, 30, 70, 80)],
  9 : [(49, 25, 72, 83)],
  10 : [(13, 21, 75, 82), (74, 25, 16, 21)]
}

print "Image 9 => Width={} Height={}\n".format( images[9][0][2], images[9][0][3] )