我想从下面的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
答案 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