2014-09-01 91 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')