使用 Python 从 txt 文件加载矩形数据?
Load rectangle data from txt file with Python?
我在 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
与图像关联。
这些数据是 space 分开的。
第三行显示此图像有两个矩形,但可能有很多。
同一行的矩形用制表符分隔。
因此,同一行上的两个矩形的书面示例如下:
img_num<space>lefttopcorner.X<space>lefttopcorner.Y<space>width<space>height<tab>...
我如何将这些矩形加载到 python 中的 vars 中并将它们放入某个集合结构中。
可能有元组的平行数组或 rectangles?
正在寻找最简单的实现。
我总是首先考虑我的数据模型。在这里,您可能有一个字典,其中图像编号作为键,矩形列表作为值。每个矩形都可以是一个Rectangle对象(供你实现)。
您也可以将解析分成几部分,从处理每一行开始:
image_number, rects = line[0], line[1:]
然后解析你的矩形,在另一个函数中更好,将 rects
作为参数,提取 4 乘 4 的值,将它们提供给 Rectangle 对象的构造函数。最后,您的矩形对象必须以正确的顺序将 4 个值放入 4 个命名成员中。
是的,您必须实现 Rectangle 及其构造函数。您可以选择使用 4 个整数的元组而不是矩形 class,这取决于您。
存储的另一个想法可能是拥有一个图像 class,在其构造函数中采用 rects
,并保存矩形列表。所以你的字典存储 image_number 作为键和图像作为值。
这样,您可以实现 Image.draw(),访问 self.rectangles.
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())
最简单的实现是 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]
我会选择元组列表字典。
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] )
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)
写 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
我在 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
与图像关联。
这些数据是 space 分开的。
第三行显示此图像有两个矩形,但可能有很多。
同一行的矩形用制表符分隔。
因此,同一行上的两个矩形的书面示例如下:
img_num<space>lefttopcorner.X<space>lefttopcorner.Y<space>width<space>height<tab>...
我如何将这些矩形加载到 python 中的 vars 中并将它们放入某个集合结构中。
可能有元组的平行数组或 rectangles?
正在寻找最简单的实现。
我总是首先考虑我的数据模型。在这里,您可能有一个字典,其中图像编号作为键,矩形列表作为值。每个矩形都可以是一个Rectangle对象(供你实现)。
您也可以将解析分成几部分,从处理每一行开始:
image_number, rects = line[0], line[1:]
然后解析你的矩形,在另一个函数中更好,将 rects
作为参数,提取 4 乘 4 的值,将它们提供给 Rectangle 对象的构造函数。最后,您的矩形对象必须以正确的顺序将 4 个值放入 4 个命名成员中。
是的,您必须实现 Rectangle 及其构造函数。您可以选择使用 4 个整数的元组而不是矩形 class,这取决于您。
存储的另一个想法可能是拥有一个图像 class,在其构造函数中采用 rects
,并保存矩形列表。所以你的字典存储 image_number 作为键和图像作为值。
这样,您可以实现 Image.draw(),访问 self.rectangles.
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())
最简单的实现是 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]
我会选择元组列表字典。
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] )
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)
写 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