簡體   English   中英

如何從Python中的文件中提取浮點數?

[英]How to I extract floats from a file in Python?

所以,我有一個看起來像這樣的文件:

# 3e98.mtz MR_AUTO with model 200la_.pdb
SPACegroup HALL P 2yb #P 1 21 1
SOLU SET RFZ=3.0 TFZ=4.7 PAK=0 LLG=30
SOLU 6DIM ENSE 200la_ EULER 321.997 124.066 234.744 FRAC -0.14681 0.50245 -0.05722
SOLU SET RFZ=3.3 TFZ=4.2 PAK=0 LLG=30
SOLU 6DIM ENSE 200la_ EULER 329.492 34.325 209.775 FRAC 0.70297 0.00106 -0.24023
SOLU SET RFZ=3.6 TFZ=3.6 PAK=0 LLG=30
SOLU 6DIM ENSE 200la_ EULER 177.344 78.287 187.356 FRAC 0.04890 0.00090 -0.57497

迭代此文件並僅提取浮點數的最佳方法是什么?

在這種情況下,“最佳”方案是僅提取類似於“321.997”的數字(它們是病毒細胞結構坐標)並將它們添加到列表中。 在我看的每個文件中,每行有6個數字。 在我提取這些數字之后,我可以在我已經編寫的方法中使用該列表來計算用於旋轉單元結構以匹配數據集中其他數據的新坐標。

這是一種方式。

def floats( aList ):
    for v in aList:
        try:
            yield float(v)
        except ValueError:
            pass

a = list( floats( [....] ) )
floats = []
all = ['#', '3e98.mtz', 'MR_AUTO', 'with', 'model', '200la_.pdb', 'SPACegroup', 'HALL', 'P', '2yb', '#P', '1', '21', '1', 'SOLU', 'SET', 'RFZ=3.0', 'TFZ=4.7', 'PAK=0', 'LLG=30', 'SOLU', '6DIM', 'ENSE', '200la_', 'EULER', '321.997', '124.066', '234.744', 'FRAC', '-0.14681', '0.50245', '-0.05722', 'SOLU', 'SET', 'RFZ=3.3', 'TFZ=4.2', 'PAK=0', 'LLG=30', 'SOLU', '6DIM', 'ENSE', '200la_', 'EULER', '329.492', '34.325', '209.775', 'FRAC', '0.70297', '0.00106', '-0.24023', 'SOLU', 'SET', 'RFZ=3.6', 'TFZ=3.6', 'PAK=0', 'LLG=30', 'SOLU', '6DIM', 'ENSE', '200la_', 'EULER', '177.344', '78.287', '187.356', 'FRAC', '0.04890', '0.00090', '-0.57497']
for element in all:
    try:
        floats.append(float(element))
    except ValueError:
        pass
def is_float(i):
        try:
            float(i)
            return True
        except ValueError:
            return False


L=['#', '3e98.mtz', 'MR_AUTO', 'with', 'model', '200la_.pdb', 'SPACegroup', 'HALL', 'P', '2yb', '#P', '1', '21', '1', 'SOLU', 'SET', 'RFZ=3.0', 'TFZ=4.7', 'PAK=0', 'LLG=30', 'SOLU', '6DIM', 'ENSE', '200la_', 'EULER', '321.997', '124.066', '234.744', 'FRAC', '-0.14681', '0.50245', '-0.05722', 'SOLU', 'SET', 'RFZ=3.3', 'TFZ=4.2', 'PAK=0', 'LLG=30', 'SOLU', '6DIM', 'ENSE', '200la_', 'EULER', '329.492', '34.325', '209.775', 'FRAC', '0.70297', '0.00106', '-0.24023', 'SOLU', 'SET', 'RFZ=3.6', 'TFZ=3.6', 'PAK=0', 'LLG=30', 'SOLU', '6DIM', 'ENSE', '200la_', 'EULER', '177.344', '78.287', '187.356', 'FRAC', '0.04890', '0.00090', '-0.57497']
print filter(is_float,L)

如果您以不鼓勵回答者檢查其結構的方式顯示您的輸入,並且您提出諸如“我如何僅提取浮點數”之類的問題,並隱藏有用的信息,例如“在我正在查看的每個文件中,有每行中有6個數字“在評論中,您將得到完全符合您要求的下意識答案:列表前面包含3個虛假數字(1.0,21.0和1.0)的”浮點數“列表。

如果您以稍微更合適的方式顯示數據,例如:

alist = [
    '#', '3e98.mtz', 'MR_AUTO', 'with', 'model', '200la_.pdb', 'SPACegroup', 'HALL', 'P', '2yb',
    '#P', '1', '21', '1', 
    'SOLU', 'SET', 'RFZ=3.0', 'TFZ=4.7', 'PAK=0', 'LLG=30', 'SOLU', '6DIM', 'ENSE', '200la_',
        'EULER', '321.997', '124.066', '234.744', 'FRAC', '-0.14681', '0.50245', '-0.05722',
    'SOLU', 'SET', 'RFZ=3.3', 'TFZ=4.2', 'PAK=0', 'LLG=30', 'SOLU', '6DIM', 'ENSE', '200la_',
        'EULER', '329.492', '34.325', '209.775', 'FRAC', '0.70297', '0.00106', '-0.24023',
    'SOLU', 'SET', 'RFZ=3.6', 'TFZ=3.6', 'PAK=0', 'LLG=30', 'SOLU', '6DIM', 'ENSE', '200la_', 
        'EULER', '177.344', '78.287', '187.356', 'FRAC', '0.04890', '0.00090', '-0.57497'
    ]

有可能人們會注意到結構(EULER后跟三個數字,然后是FRAC,然后是三個數字)重復,然后去“Oho,他的文件中每行六個數字”,然后回來一些更有用的建議,比如:

從頭開始,告訴我們你的文件結構是什么。 獲取信息的方法可能比將文件粉碎成字符串列表然后嘗試從中恢復更好。

更新同時,這里有一個答案,它使用了數據和注釋中明顯的結構,如果結構有變化,它將更易於調試:

TAG0 = 'EULER'
TAG1 = 'FRAC'

def extract_rows(tokens):
    pos = 0
    while True:
        try:
            pos = tokens.index(TAG0, pos)
        except ValueError:
            return
        assert pos + 8 <= len(tokens)
        assert tokens[pos+4] == TAG1
        yield (
            tuple(map(float, tokens[pos+1:pos+4])),
            tuple(map(float, tokens[pos+5:pos+8])),
            )
        pos += 8

for rowx, row in enumerate (extract_rows(alist)):
    print rowx, 'TAG0', row[0]
    print rowx, 'TAG1', row[1]

結果:

0 TAG0 (321.99700000000001, 124.066, 234.744)
0 TAG1 (-0.14681, 0.50244999999999995, -0.05722)
1 TAG0 (329.49200000000002, 34.325000000000003, 209.77500000000001)
1 TAG1 (0.70296999999999998, 0.00106, -0.24023)
2 TAG0 (177.34399999999999, 78.287000000000006, 187.35599999999999)
2 TAG1 (0.048899999999999999, 0.00089999999999999998, -0.57496999999999998)

更新2根據您的示例文件,以下簡單代碼(未經測試)應該執行您想要的操作:

for line in open('my_file.txt'):
    row = line.split()
    if row[0] == 'SOLU' and row[1] == '6DIM' and row[4] == 'EULER' and row[8] == 'FRAC':
        euler = map(float, row[5:8])
        frac = map(float, row[9:12])
        do_something_with(euler, frac)

注意:你所尋找的是“所有浮點數”(它忽略了RFZ=3.0 TFZ=4.7中的RFZ=3.0 TFZ=4.7 ,這只是巧合!)。 你所擁有的是一個帶有STRUCTURE的文件:兩種類型的SOLU記錄,你想要在SOLU 6DIM記錄中出現在EULER之后的3個數字和FRAC之后的3個數字。 您不需要所有這些數字的列表,並且必須將它們再次拆分為(3個EULER數字和3個FRAC數字)乘以N.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM