Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python从文件中读取数据块_Python_Numpy_Block - Fatal编程技术网

用Python从文件中读取数据块

用Python从文件中读取数据块,python,numpy,block,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-

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

在gnuplot中选择数据块要容易得多,但我必须编写例程来绘制分布函数。如果我能理解如何读取特定的块,那么在python中就容易多了。此外,我正在将所有可视化代码从IDL和gnuplot迁移到python,因此最好将所有内容都放在python中,而不是分散在多个包中

我考虑从python内部调用gnuplot,将一个块绘制到一个表中,并将输出分配给python中的某个数组。但是我仍然在开始,我不知道如何使用语法


任何解决这个问题的想法和指针都会非常有帮助。

下面的代码可能会帮助您开始。您可能需要重新安装模块

您可以使用以下方法打开文件进行读取:

f = open("file_name_here")
通过使用,您可以一次读取一行文件

line = f.readline()
要跳转到以“#”开头的下一行,可以使用:

while not line.startswith("#"):
    line = f.readline()
要分析类似于“#i j”的行,可以使用以下正则表达式:

is_match = re.match("#\s+(\d+)\s+(\d+)",line)
if is_match:
    i = is_match.group(1)
    j = is_match.group(2)
有关这方面的更多信息,请参阅“re”模块的文档

要解析块,可以使用以下代码位:

block = [[]] # block[i][j] will contain element i,j in your block
while not line.isspace(): # read until next blank line
    block.append(map(float,line.split(" "))) 
    # splits each line at each space and turns all elements to float
    line = f.readline()
然后,如果需要,可以将块转换为numpy阵列:

block = np.array(block)
如果您已将numpy作为np导入。 如果您想读取i和j之间的多个块,只需将上面的代码读入一个函数中并多次使用它即可

希望这有帮助

快速基本阅读:

>>> 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
>>> 

现在我想您可以使用numpy来读取行…

因此您希望用户指定,比如说一对值(I,j),并读取行“#I j”和下一个空行之间的所有行?Alsmot!我想做的就是能够指定I,j,其中I是起始块,j是最终块,一个块由两行或多行分隔的行定义。非常感谢Pascal!我从你的帖子中分离出了这句话,并在Emmanual的建议中使用了它。最终,我将实现您的建议,从“#”行解析文本,但现在,我只需要获得一个工作代码,并在本周内绘制一些绘图!唉…非常感谢Emmanuel!!它几乎完全是开箱即用的。我确实需要学习一些知识,并处理文件中的空格等。我还实现了Pascal的建议,在添加块之前拆分行。现在,最后的代码为我提供了一个3D数组,其中每个块都是3D数组中的一个平面。非常感谢你的帮助!我希望我能更快地学习python。在这方面有更优雅的实现方式吗?b=a.拆分();b=np.数组(b);b=b.astype(float)感谢您的验证!关于你的问题,我不明白为什么
b=np.array(a.split()).astype(float)
不起作用。谢谢!这似乎是一种比我所拥有的更干净的方式。