比较值和打印

时间:2014-09-01 15:59:34

标签: python

我想从下面的ASCII文件中读出某些行,并将其保存到另一个文件中。例如,我想读出从第2列开始的行,其值为17.如果第2列的值为17,则只有该行转到输出文件。

到目前为止,我有一个代码,

import numpy as np
datafilename = 'pol_17.txt'
g = np.genfromtxt(datafilename, skiprows=6, usecols=(1, 2, 3, 4, 5, 6,7),delimiter=None, dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4'), ('f3', '<f8'), ('f4', '<f8'), ('f5', '<f8'), ('f6', '<f8')])
if g['f0']==17:
    print[g]

在输出中,我从python获得“ValueError:”。

输入文件格式如下。

# Energy  = 4.92758E+03 
# ESigma  = 2.80000E+00 
# ETrans  = 3.78310E+02 
# Density = 1.00000E+00 
# IDR     = -1 

  7    16     0 -1  6.49729E+03  5.59241E-04  1.177E+00  4.511E-01
  7    16     1 -1  6.47947E+03  4.05646E-05  1.177E+00  4.511E-01
  7    17     0 -1  6.50710E+03  7.44345E-02  8.230E-01 -6.451E-01
  7    17     1 -1  6.48929E+03  2.11547E-03  8.230E-01 -6.451E-01
  7    17     2 -1  6.48454E+03  3.67490E-03  1.044E+00  1.271E-01
  7    17     3 -1  6.47442E+03  8.22948E-05  1.221E+00  5.434E-01
  7    18     3 -1  6.47664E+03  3.25040E-03  1.000E+00  0.000E+00
  7    18     4 -1  6.46889E+03  4.90487E-04  1.000E+00  0.000E+00
  7    18    13 -1  6.26433E+03  2.38729E-05  1.000E+00  0.000E+00
  7    18    14 -1  6.25109E+03  5.84543E-06  1.000E+00  0.000E+00

3 个答案:

答案 0 :(得分:2)

一种简单的方法是:

np.savetxt(outputfilename, g[g['f0'] == 17], fmt='%d %d %d %E% E %E %E')

其中outputfilename设置为适当的输出文件名。如果我要命名该文件test2.dat,我会得到:

> cat test2.dat
17 0 -1 6.507100E+03 7.443450E-02 8.230000E-01 -6.451000E-01
17 1 -1 6.489290E+03 2.115470E-03 8.230000E-01 -6.451000E-01
17 2 -1 6.484540E+03 3.674900E-03 1.044000E+00 1.271000E-01
17 3 -1 6.474420E+03 8.229480E-05 1.221000E+00 5.434000E-01

可以修改格式字符串以获得文件中的特定间距/精度。

答案 1 :(得分:1)

问题是g ['f0']不是列中的条目,而是整个列。

print g['f0'] #outputs [16 16 17 17 17 17 18 18 18 18]

我们可以编写一个非常简单的程序来输出每一行:

for idx, num in enumerate(g['f0']):
    if num == 17:
        print g[idx]

答案 2 :(得分:0)

我认为你需要迭代行:

for row in g:
    if row['f0'] == 17:
        print row