用Python从文件中读取数据块

2024-04-23 21:54:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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中的某个数组。但我仍然在开始,我无法找出语法来做这件事。

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


Tags: 文件of数据numpydatacomment绘制some
2条回答

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

可以使用以下命令打开文件进行读取:

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来读台词了。。。

相关问题 更多 >