簡體   English   中英

忽略文件中的注釋行

[英]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.1e2nan-inf3等)。 之所以可以使用它,是因為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.

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