我正在从网上阅读一个文本文件。该文件以包含数据点数的一些标题行开始,跟随实际顶点(每个3个坐标)。该文件看起来像:
# comment
HEADER TEXT
POINTS 6 float
1.1 2.2 3.3 4.4 5.5 6.6 7.7 8.8 9.9
1.1 2.2 3.3 4.4 5.5 6.6 7.7 8.8 9.9
POLYGONS
以单词POINTS
开头的行包含顶点数(在这种情况下,我们每行有3个顶点,但可能会更改)
这就是我现在正在阅读的内容:
ur=urlopen("http://.../file.dat")
j=0
contents = []
while 1:
line = ur.readline()
if not line:
break
else:
line=line.lower()
if 'points' in line :
myline=line.strip()
word=myline.split()
node_number=int(word[1])
node_type=word[2]
while 'polygons' not in line :
line = ur.readline()
line=line.lower()
myline=line.split()
i=0
while(i<len(myline)):
contents[j]=float(myline[i])
i=i+1
j=j+1
如何读取指定数量的浮点数而不是逐行读取字符串并转换为浮点数?
而不是ur.readline()我想读取文件中指定数量的元素
欢迎任何建议......
答案 0 :(得分:3)
我不完全确定你的解释是什么目标。
对于记录,这里的代码基本上与您的尝试基本相同,它使用了一些技术,我将使用的技术超过您选择的那些技术。如果你使用的是while循环和索引,而且你的代码确实无效,因为contents[j] = ...
将是IndexError
,这通常表明你做错了。
lines = (line.strip().lower() for line in your_web_page)
points_line = next(line for line in lines if 'points' in line)
_, node_number, node_type = points_line.split()
node_number = int(node_number)
def get_contents(lines):
for line in lines:
if 'polygons' in line:
break
for number in line.split():
yield float(number)
contents = list(get_contents(lines))
如果您对新事物更加明确,那么也许有人可以为您的最终目标提供更好的答案。
答案 1 :(得分:0)
这是对代码进行简单清理,可以更快地循环内容。
ur=urlopen("http://.../file.dat")
contents = []
node_number = 0
node_type = None
while 1:
line = ur.readline()
if not line:
break
line = line.lower()
if 'points' in line :
word = line.split()
node_number = int(word[1])
node_type = word[2]
while 1:
pieces = ur.readline().split()
if not pieces: continue # or break or issue error message
if pieces[0].lower() == 'polygons': break
contents.extend(map(float, pieces))
assert len(contents) == node_number * 3
如果你将代码包装在函数中并调用它,它将运行得更快(因为你将访问局部变量而不是全局变量)。
请注意,最重要的更改是在脚本末尾/附近。
但是:请退一步思考几秒钟:ur.readline()占用多少时间以及拆开行多少钱?