2016-02-26 76 views
-1

我有一個名爲「file.txt」的文件,我想寫我的程序的第一部分有一個函數來首先輸出2個文件。 我的代碼:從一個函數輸出文件Python

f = open("file.txt", "r+") 
def Filter_NoD(f): 
    """this function filters out lines with no D region and saves them in a separate file""" 
    lines = open(f, "r+").read().splitlines() 
    NoD = open("NoD.txt", "w") 
    withD = open("withD.txt", "w") 
    for i, line in enumerate(lines): 
      if ">No D" in line: 
      NoD.write(lines[i-2]+"\n"+lines[i-1]+"\n"+lines[i]) 
      else: 
      withD.write(line+"\n") 
    return NoD, withD 

我不能輸出2個文件,NoD.txt和withD.txt,我也試過用了return語句,並仍然沒有輸出文件。 我做錯了什麼?

+0

你是什麼意思,你不能輸出2個文件?...你得到的錯誤?...或文件是空的?...如果是後者,那可能是因爲你沒有關閉文件.. ('NoD.close()'和'withD.close()')..但是如果它是前者然後發佈回溯錯誤消息 –

+0

您發佈的代碼適用於我。你有錯誤嗎?編輯您的問題以包含它。也許問題在於你如何稱呼你的功能。我會注意到你有一個名爲'f'的全局變量,那麼你也有一個名爲'f'的函數的參數,這可能會造成混淆。你的全局'f'是一個文件,你的'f'參數是一個字符串(文件的路徑)。 – dsh

+0

我建議在成功或錯誤時使用['with'語句](https://docs.python.org/2/reference/compound_stmts.html#the-with-statement)來自動關閉文件。 – dsh

回答

1

首先,你的縮進是錯誤的。

其次,你傳遞fdef但似乎f是一個文件處理程序,所以你不能再次打開它的定義裏面。

這裏是一個工作代碼:

file.txt內容:

asd 
>No D bsd 
csd 

代碼:

f = open("file.txt", "r+") 
def Filter_NoD(f): 
    """this function filters out lines with no D region and saves them in a separate file""" 
    lines = f.read().splitlines() # As f is already a file handler, you can't open it again 
    NoD = open("NoD.txt", "w") 
    withD = open("withD.txt", "w") 
    for i, line in enumerate(lines): 
     if ">No D" in line: 
      NoD.write(lines[i-2]+"\n"+lines[i-1]+"\n"+lines[i]) 
     else: 
      withD.write(line+"\n") 
    return NoD, withD 

Filter_NoD(f) # Dont forget to call the function, and that you pass a file handler in 

運行的NoD.txt內容之後:

csd 
asd 
>No D bsd 

withD.txt內容:

asd 
csd 
1

你永遠不會調用實際的功能。

+0

是的,我只是意識到!謝謝 – Jessica

1

當我複製和粘貼功能Filter_NoD以上,並調用它的一些文件,我叫file.txt寫了一些廢話

some 
stuff 
inasd 
this 
file 
>No D 
sthaklsldf 

我得到兩個文件的輸出,包含預期輸出的NoD.txtwithD.txt。這證實了我懷疑你的代碼大部分是正確的。

所以,我猜想的一對夫婦的事情之一正在發生:

  1. 你不是在尋找正確的文件夾,您所呼叫的Python程序,所以這些文件被保存,只是不你在找什麼。

  2. 你是否從python解釋器得到任何錯誤?我問,因爲在你給出的代碼片段中,f = open("file.txt", "r+")正好在Filter_NoD的函數定義之上。你打電話Filter_NoD與一個文件對象(f)而不是文件路徑,這是什麼Filter_NoD預計?如果是這樣,程序錯誤,沒有與寫入。

除了上述內容,您需要小心打開文件對象的方式。這是更加安全範圍with塊中打開的文件,如:

def Filter_NoD(f): 
     lines = open(f, "r+").read().splitlines() 
     with open("NoD.txt", "w") as NoD: 
      with open("withD.txt", "w") as withD: 
       for i, line in enumerate(lines): 
        if ">No D" in line: 
         NoD.write(lines[i-2]+"\n"+lines[i-1]+"\n"+lines[i]) 
        else: 
         withD.write(line+"\n") 

如果你這樣做,那麼該文件將自動關閉,當您退出功能。

相關問題