从Python中读取文件中的数据块

toy*_*las 5 python numpy block

我是python的新手,我正试图从文件中读取"块"数据.该文件的内容类似于:

# Some comment
# 4 cols of data --x,vx,vy,vz
# nsp, nskip =           2          10


#            0   0.0000000


#            1           4
 0.5056E+03  0.8687E-03 -0.1202E-02  0.4652E-02
 0.3776E+03  0.8687E-03  0.1975E-04  0.9741E-03
 0.2496E+03  0.8687E-03  0.7894E-04  0.8334E-03
 0.1216E+03  0.8687E-03  0.1439E-03  0.6816E-03


#            2           4
 0.5056E+03  0.8687E-03 -0.1202E-02  0.4652E-02
 0.3776E+03  0.8687E-03  0.1975E-04  0.9741E-03
 0.2496E+03  0.8687E-03  0.7894E-04  0.8334E-03
 0.1216E+03  0.8687E-03  0.1439E-03  0.6816E-03


#          500  0.99999422


#            1           4
 0.5057E+03  0.7392E-03 -0.6891E-03  0.4700E-02
 0.3777E+03  0.9129E-03  0.2653E-04  0.9641E-03
 0.2497E+03  0.9131E-03  0.7970E-04  0.8173E-03
 0.1217E+03  0.9131E-03  0.1378E-03  0.6586E-03

and so on
Run Code Online (Sandbox Code Playgroud)

现在我希望能够从这些多个块中指定和读取一个数据块.我正在使用numpy.loadtxt('filename',comments='#')读取数据,但它一次性加载整个文件.我在网上搜索,有人为numpy io例程创建了一个补丁来指定阅读块,但它不是主流的numpy.

在gnuplot中选择数据块要容易得多,但是我必须编写例程来绘制分布函数.如果我能弄清楚读取特定块,那么在python中会更容易.此外,我正在将所有可视化代码从IDL和gnuplot移动到python,因此将所有内容都放在python中而不是将内容分散在多个包中会很好.

我想过在python中调用gnuplot,将一个块绘制到一个表并将输出分配给python中的某个数组.但我还在开始,我无法弄清楚这样做的语法.

任何想法,解决这个问题的指针都会有很大的帮助.

Emm*_*uel 5

快速基本阅读:

>>> def read_blocks(input_file, i, j):
    empty_lines = 0
    blocks = []
    for line in open(input_file):
        # Check for empty/commented lines
        if not line or line.startswith('#'):
            # If 1st one: new block
            if empty_lines == 0:
                blocks.append([])
            empty_lines += 1
        # Non empty line: add line in current(last) block
        else:
            empty_lines = 0
            blocks[-1].append(line)
    return blocks[i:j + 1]

>>> for block in read_blocks(s, 1, 2):
    print '-> block'
    for line in block:
        print line


-> block
 0.5056E+03  0.8687E-03 -0.1202E-02  0.4652E-02
 0.3776E+03  0.8687E-03  0.1975E-04  0.9741E-03
 0.2496E+03  0.8687E-03  0.7894E-04  0.8334E-03
 0.1216E+03  0.8687E-03  0.1439E-03  0.6816E-03
-> block
 0.5057E+03  0.7392E-03 -0.6891E-03  0.4700E-02
 0.3777E+03  0.9129E-03  0.2653E-04  0.9641E-03
 0.2497E+03  0.9131E-03  0.7970E-04  0.8173E-03
 0.1217E+03  0.9131E-03  0.1378E-03  0.6586E-03
>>> 
Run Code Online (Sandbox Code Playgroud)

现在我想你可以使用numpy来读取这些行......