2017-10-21 201 views
1

我正在製作一個文件類型來存儲來自我的程序的信息。文件類型可以包括以#開頭的行,如:刪除列表中的所有項目#

# This is a comment. 

如圖所示,行前的#表示註釋。 我已經用Python寫的一個程序,可以閱讀這些文件:

fileData = [] 

file = open("Tutorial.rdsf", "r") 

line = file.readline() 

while line != "": 
    fileData.append(line) 
    line = file.readline() 

for item in list(fileData): 
    item.strip() 

fileData = list(map(lambda s: s.strip(), fileData)) 

print(fileData) 

正如你所看到的,它需要的文件,增加了每行作爲一個列表中的項目,並去除\ n的項目。到現在爲止還挺好。

但是,這些文件通常包含我所做的評論,並且這些程序將它們添加到列表中。

有沒有辦法從#開始刪除列表中的所有項目?

編輯:爲了使事情更清楚一點:評論不會是這樣的:

Some code: 
{Some Code} #Foo 

他們會是這樣的:

#Foo 
Some code: 
{Some Code} 
+2

不要使用while循環,直接遍歷文件。你的'readline' while循環可以被'fileData = file替換。readlines()'(複數)或'fileData = list(file)'。 –

+1

你的'for'循環去除線條根本不起作用,因爲你永遠不會分回去掉的線條。你不需要調用'list()'沒有一個對象已經是一個列表。 –

+0

請參閱[什麼是Python中「完美對應」的對應方法](// stackoverflow.com/q/15599639) –

回答

0

您可以在直接處理線for loop:

with open("Tutorial.rdsf", "r") as file: 
    for line in file: 
     if line.startswith('#'): 
      continue # skip comments 
     line = line.strip() 

     # do more things with this line 

只有在需要時纔將它們放入列表中訪問(例如,您需要訪問特定索引處的行)。

我使用with語句來管理打開的文件,當Python到達with塊的末尾時,該文件將自動關閉。

+0

如果是代碼文件,那麼strip()將刪除縮進(而不是使用rstrip)。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅ:我認爲我們不需要用這個小小的上下文做出相當大的飛躍,並不是所有的代碼都依賴於縮進。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅ:我們甚至不知道'#'之前的空白符號是否重要。在'#'之前的空格的回答行不被忽略,在你的它們是。兩者都是有效的方法。 –

0

從頂部開始,使用上下文管理器,它更容易使用文件。

with open("Tutorial.rdsf", "r") as f: 
    code = [] 
    for line in f: 
     if not line.strip().startswith('#'): 
      code.append(line.rstrip()) 

如果您不想剝去尾隨的換行符,請刪除.rstrip調用。


另一種方法是讀入整個文件,然後調用過濾器。

with open("Tutorial.rdsf", "r") as f: 
    code = filter(lambda x: not x.strip().startswith('#'), f.readlines()) 

注意,第二方法與尾隨的換行符追加臺詞

+0

OP需要未剝離線的列表。 –

+0

@MartijnPieters是的,他們都是。我會爲此補充一點,謝謝。 –

-1

很容易檢查領先#標誌。

更改此:

while line != "": 
    fileData.append(line) 
    line = file.readline() 

這樣:

while line != "": 
    if not line.startswith("#"): 
     fileData.append(line) 
    line = file.readline() 

但是你的程序有點複雜了它的作用。查看文檔中關於for line in file:的解釋。

+1

他們不應該在所有**都使用'while'循環**。 –

+0

@MartijnPieters:我確實這麼說。 – BoarGules