我有下一個帶有資料的txt:
FI R 83.0000m 34.960 1.1262 Fe 2 1.32055m 33.626 0.0522 N
2 5754.61A 33.290 0.0241
TI R 1800.00m 33.092 0.0153 Fe 2 1.24854m 32.645 0.0054 N
2 915.612A 31.997 0.0012
NI Ra 2.85000m 36.291 24.1132 Fe 2 7637.54A 33.077 0.0147
我想要的是獲得第三列,是緊急線的波長,但我的問題是當我把條件放在 if 中時。
Name1,ion1,wavelength1,da1,de1,name2,ion2,
wavelength2,da2,de2,name3,ion3,wavelength3,da3,de3=np.genfromtxt('Emergent_line.txt',
skip_header=3, delimiter="", unpack=True)
if(Name1=="Fe" and ion1==2):
print(wavelength1)
elif(name2=="Fe" and ion2==2):
print(wavelength2)
elif(name3=="Fe" and ion3==2):
print(wavelength3)
在txt中我想找到Fe 2 的波長,但我認為問題是波長最后有一個字母,我不想洗掉,因為我有一個這樣的大串列。我嘗試了另一個froms,但我還沒有解決它。
uj5u.com熱心網友回復:
我認為你最好使用正則運算式
例子:
import re
text = '''FI R 83.0000m 34.960 1.1262 Fe 2 1.32055m 33.626 0.0522 N
2 5754.61A 33.290 0.0241
TI R 1800.00m 33.092 0.0153 Fe 2 1.24854m 32.645 0.0054 N
2 915.612A 31.997 0.0012
NI Ra 2.85000m 36.291 24.1132 Fe 2 7637.54A 33.077 0.0147'''
find_this = re.findall('(Fe 2.*?[0-9].*?)\s', text)
print(find_this)
輸出:
['Fe 2 1.32055m', 'Fe 2 1.24854m', 'Fe 2 7637.54A']
[Program finished]
或者,如果您只想要這些值。
find_this = re.findall('Fe 2.*?([0-9].*?)\s', text)
輸出:
['1.32055m', '1.24854m', '7637.54A']
[Program finished]
uj5u.com熱心網友回復:
這是另一個想法,不使用re模塊:
someText ='FI R 83.0000m 34.960 1.1262'
someText.split()
#>> ['FI', 'R', '83.0000m', '34.960', '1.1262']
name1,ion1, lambda1, *other = someText.split()
lambda1 = float(lambda1[0:-1])
print(lambda1, other)
#>> 83.0 ['34.960', '1.1262']
您可以使用.split()str 方法,該方法在分隔資料的空白處進行拆分,而無需正則運算式。
正則運算式非常適合在輸入變化時提取更復雜的文本格式案例。由于在這種情況下輸入并沒有真正變化,因此您也可以使用更簡單的str方法。
uj5u.com熱心網友回復:
您提供的文本檔案似乎是一個平面檔案或固定檔案,其中布置了資料(列)
- 作為位置文本(每列從預定義的位置開始)
- 以固定寬度格式(每列具有固定寬度)
Pandas 有一種讀取固定寬度檔案的方法
您可以使用pandas和他們的 IO 工具方法read_fwf。
import io # just for demonstration without needing a file
import pandas
text = '''FI R 83.0000m 34.960 1.1262 Fe 2 1.32055m 33.626 0.0522 N
2 5754.61A 33.290 0.0241
TI R 1800.00m 33.092 0.0153 Fe 2 1.24854m 32.645 0.0054 N
2 915.612A 31.997 0.0012
NI Ra 2.85000m 36.291 24.1132 Fe 2 7637.54A 33.077 0.0147'''
buffer = io.StringIO(text) # just a helper to read from text as from file
filepath_or_buffer = buffer # can also be the file-path directly
df = pandas.read_fwf(filepath_or_buffer, colspecs='infer', widths=None, infer_nrows=100, header=None)
print(df) # df represented as complete table read
wave_lengths = df.loc[(df[3] == 'Fe') & (df[4] == 2)][5]
print("== Wavelengths:")
print(wave_lengths)
buffer.close()
印刷:
0 1 2 3 4 5 6 7 8
0 FI R 83.0000m 34.960 1.1262 Fe 2.0 1.32055m 33.626 0.0522 N
1 2 NaN 5754.61A 33.290 0.0241 NaN NaN NaN NaN NaN NaN
2 TI R 1800.00m 33.092 0.0153 Fe 2.0 1.24854m 32.645 0.0054 N
3 2 NaN 915.612A 31.997 0.0012 NaN NaN NaN NaN NaN NaN
4 NI Ra 2.85000m 36.291 24.1132 Fe 2.0 7637.54A 33.077 0.0147 NaN
== Wavelengths:
0 1.32055m
2 1.24854m
4 7637.54A
筆記:
- Python
io.StringIO被用作模擬緩沖區而不是檔案的助手。 - Panda
loc定位或過濾Fe 2行的方法,我們用波長列印了第 5 列
也可以看看
- 邁向資料科學:用 Pandas 決議固定寬度的文本檔案 通過艾米拉斯克
- Pandas 的IO 工具(文本、CSV、HDF5……)
- 從平面檔案中決議資料
- python - 將文本檔案決議為 pandas DataFrame
- 如何有效地決議固定寬度的檔案?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/479464.html
