[英]Ignoring a comment line in file
假設有一個文件包含數字行和注釋,例如:
#comments
12 #this is number
2.4 #this is float
閱讀文件並將數字附加到列表中。 我正在嘗試僅獲取數字,但是不知何故它附加了#this是數字和#this是浮點數。
您可以使用split
:
>>> 'foo #comment'.split('#', 1)[0]
'foo '
>>> 'foo comment'.split('#', 1)[0]
'foo comment'
使用這種簡單的情況, 您不必使用更復雜,更慢的正則表達式機制 ( re
模塊)。 str.split()
是您的朋友 :
output = []
with open('somefile.txt') as f:
for line in f:
parts = line.split('#', 1) # Maximum 1 split, on comments
try:
output.append(float(parts[0])) # The single, or pre-comment part is added
except ValueError: # Beginning is not float-like: happens for "# comment", " # comment", etc.
pass # No number found
這會自動處理浮點數的所有可能語法 ( 1.1e2
, nan
, -inf
, 3
等)。 之所以可以使用它,是因為float()
非常強大:它可以處理尾隨空格和換行符 (通過忽略它們)。
這也是非常有效的 ,因為不失敗的try
速度很快(通常比顯式測試要快)。
這還將處理在文件中間找到的注釋。 如果您僅在文件開頭添加純注釋 ,我們可以簡化代碼,並使用保證每一行都有數字的事實:
output = []
with open('somefile.txt') as f:
next(f) # Skips the first, comment line
for line in f:
output.append(float(line.split('#', 1)[0])) # The single or pre-comment part is guaranteed to be a float representation
我認為沒有任何一種比這簡單得多的顯式方法(除了使用split('#')
計算可能太多的線段之外)。
也就是說,可以考慮使用隱式方法 ,例如abathur,其中eval(line)
代替了整個float(…)
部分; 但是,在這種情況下,代碼不會顯示期望使用浮點數,並且正如Python Zen所說的那樣,“顯式優於隱式。”,因此,我不建議使用eval()
方法,除非它用於一鍵式,快速而骯臟的腳本。
盡管其他人已經討論了文件閱讀的后勤問題,但我只想指出另一種方法:假設您所使用的文件遵循Python的語法,則可以使用eval函數獲取該行的值減去注釋。
>>> eval("10 #comment")
10
當然,請牢記eval()
在執行Python代碼時要考慮安全性,如果對數據文件的控制權少於對執行腳本的控制,則任意代碼執行可能是程序的漏洞。用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.