Python-比较文件中的字符串
我正在学习Python在Inkscape中进行扩展,在比较从文件加载的字符串时遇到了一个问题。我要做的是加载我在文本文件中定义的多边形:Python-比较文件中的字符串,python,string,file,Python,String,File,我正在学习Python在Inkscape中进行扩展,在比较从文件加载的字符串时遇到了一个问题。我要做的是加载我在文本文件中定义的多边形: polygon r:255 g:0 b:0 50;50 50;100 100;50 我的解析方法如下: def load_file(filepath, parent, log): file = open(filepath) x = [] y = [
polygon
r:255
g:0
b:0
50;50
50;100
100;50
我的解析方法如下:
def load_file(filepath, parent, log):
file = open(filepath)
x = []
y = []
r = 0
g = 0
b = 0
index = 0
for line in file:
fline = line.lstrip("\xef\xbb\xbf").rstrip("\n")
log.write("Input string: " + repr(line) + "\n")
log.write("Formatted: " + repr(fline) + "\n")
if fline == "":
continue
elif fline is "polygon": ## Where the first line should be going
log.write("\tDetected string as polygon start delimiter\n")
if index > 0:
draw_shape(x, y, r, g, b, "Polygon", parent)
del x[0, len(x)]
del y[0, len(y)]
r = g = b = index = 0
continue
elif fline[:2] is "r:":
log.write("\tDetected string as polygon red value delimiter\n")
r = int(fline[2:])
continue
elif fline[:2] is "g:":
log.write("\tDetected string as polygon green value delimiter\n")
g = int(fline[2:])
continue
elif fline[:2] is "b:":
log.write("\tDetected string as polygon blue value delimiter\n")
b = int(fline[2:])
continue
else: ## Where the first line actually is going
log.write("\tDelimiter failed previous detections; assumed to be polygon cordinates\n")
spl = fline.split(";")
x[index] = float(spl[0]) ## Error gets thrown here
y[index] = float(spl[1])
index += 1
continue
draw_shape(x, y, r, g, b, parent)
这种方法在第一行就失败了。它会一直看到“多边形”并转到最后一个else块,在那里解析坐标。我一直保存的日志文件如下所示:
Process Started
Input string: '\xef\xbb\xbfpolygon\n'
Formatted: 'polygon'
Delimiter failed previous detections; assumed to be polygon coordinates
我已经在shell中完成了这个过程,在shell中,它说行是“过程”
是真的,所以我在这里完全迷失了方向。有什么帮助吗
fline是“多边形”
几乎总是错误的。改用fline==“多边形”
编解码器.open(文件名,encoding='utf-8-sig')
成功打开Unicode文件后,我认为这样做比您现在所做的更容易:
elements='''polygon
r:255
g:0
b:0
50;50
50;100
100;50
polygon
r:155
g:22
b:55
55;60
66;100
120;150
155;167'''
for element in re.split(r'^\s*\n',elements,flags=re.MULTILINE):
if element.startswith('polygon'):
el=element.splitlines()
poly={k:v for k,v in [s.split(':') for s in el[1:4]]}
x,y=zip(*[s.split(';') for s in el[4:]])
poly.update({'x':x, 'y': y})
print poly
印刷品:
{'y': ('50', '100', '50'), 'x': ('50', '50', '100'), 'r': '255', 'b': '0', 'g': '0'}
{'y': ('60', '100', '150', '167'), 'x': ('55', '66', '120', '155'), 'r': '155', 'b': '55', 'g': '22'}
不要使用
is
与除None
之外的任何内容进行比较。(用==
来比较平等)。@Wooble我想我要朝某人的脸上开枪。。。我就知道是那样的蠢事。介意把它写在一个答案里吗?我不太确定我在看什么。你现在可以这样做:画u形(多边形['x'],多边形['y'],多边形['r'],多边形['g'],多边形['b'],等等)
,我知道这个函数基本上产生了一个多边形对象,它是一个字典,在键中保存元组,对应于文本文件中的值,但至于它是如何实现的,我只能猜测它看起来类似于LINQ。