2014-09-01 130 views
0

我想从下面的这个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] 

在输出中,我得到 “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 

回答

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 

格式字符串可以进行修改,以获取该文件在一个特定的间距/精度。

+2

要明白这是如何工作以及为什么OP方法不对,做'打印G [“F0”] == 17'和未来'打印g [g ['f0'] == 17]' – askewchan 2014-09-01 16:57:38

+0

我有更多像上面的文件不同的值。例如,文件“pol_17.txt”的编号为17,文件中的有用行也是从17开始。而且有更多文件的范围从17到52,具有相同的格式。所以我想做一个循环,它只从每个文件中获取有用的行,然后将其保存到主文件中。 我有它的小工作程序,但它将行作为一个字符串。我想要一个格式。该计划是在第二个评论。 – chin2 2014-09-01 17:21:58

+0

'txtfile1 = open(“output_pol。(17,53):' 'gname = os.path.normpath('/ home/data_%s/pol_%d.txt'%state,dec)' ' )' 'g = np.genfromtxt(gname,skiprows = 7,usecols =(1,2,3,4,5,6,7),delimiter = None,dtype = [('f0',' chin2 2014-09-01 17:22:39

0

我认为你需要遍历行:

for row in g: 
    if row['f0'] == 17: 
     print row 
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] 
0

g['f0'] == 17做逐元素比较,因为g['f0']是一个数组

>>> g['f0'] 
array([16, 16, 17, 17, 17, 17, 18, 18, 18, 18]) 
>>> g['f0'] == 17 
array([False, False, True, True, True, True, False, False, False, False], dtype=bool) 

因此,我们有布尔值的对的g行的阵列。如果我们试图评估该为布尔(这种情况发生在if语句):

>>> bool(g['f0'] == 17) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

这是不行的,因为这样的操作没有意义无论是。但是,我们可以使用布尔数组索引数组作为一个整体,这样做只得到了行,其中g['f0']==17

>>> g[g['f0'] == 17] 
array([ (17, 0, -1, 6507.1000000000004, 0.074434500000000001, 0.82299999999999995, -0.64510000000000001), 
     (17, 1, -1, 6489.29, 0.0021154699999999999, 0.82299999999999995, -0.64510000000000001), 
     (17, 2, -1, 6484.54, 0.0036749, 1.044, 0.12709999999999999), 
     (17, 3, -1, 6474.4200000000001, 8.2294799999999997e-05, 1.2210000000000001, 0.54339999999999999)], 
     dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4'), ('f3', '<f8'), ('f4', '<f8'), ('f5', '<f8'), ('f6', '<f8')]) 

您还可以使用np.take,这是一个有点快,但几乎相当于索引方法,这是更容易阅读。要保存它,你可以做(​​从@JoshAdel被盗):

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