如何从python中的文件中读取特定的浮点数?

时间:2010-04-20 23:04:39

标签: python readfile

我正在从网上阅读一个文本文件。该文件以包含数据点数的一些标题行开始,跟随实际顶点(每个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()我想读取文件中指定数量的元素

欢迎任何建议......

2 个答案:

答案 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()占用多少时间以及拆开行多少钱?