2012-11-13 152 views
4

我的工作,說做一個程序,獲取用戶輸入一個文件,然後內的文件中刪除一個字符串,用戶指定的一個問題。我不知道如何從我擁有的(如下)到問題所要求的。一如既往,任何和所有的幫助非常感謝。io.UnsupportedOperation:無法讀取

def main(): 
    outfile = open(input("Enter a file name: "), "a") 
    string = input("Enter the string to be removed: ") 
    for string in outfile.readlines(): 
     string = string.replace(string, "") 
    outfile.close() 
    print("Done") 

main() 

我把其中一條建議,並試圖得到它的工作,但正如我在下面的代碼我的評論說,下面不返回錯誤它會創建一個空文件。我錯過了什麼讓新文件成爲刪除字符串的舊文件?進入細節之前

def main(): 
    inpath = input("Enter an input file: ") 
    line = input("Enter what you want to remove: ") 
    outpath = input("Enter an output file: ") 
    with open(inpath, "r") as infile, open(outpath, "w") as outfile: 
     for line in infile: 
      outfile.write(line.replace(line, "") + "\n") 
    print("Done.") 

main() 
+5

你必須在讀取模式下打開文件。嘗試'「a +」' – JBernardo

+0

作爲一個方面說明,您有太多名爲'string'的變量。你可能想'string1 = input(...)'然後'string = string.replace(string1,「」)''。最後,您實際上需要將字符串寫回到文件中。替換文件中的字符串有點困難。通常,您使用修改的內容創建一個新文件,然後在一天結束時,將新文件移到舊文件的頂部。 – mgilson

+0

@JBernardo:這是真的,但在這種情況下它並沒有真正的幫助。你不能只是在閱讀文件的過程中寫文件 - 或者,你可以,但是它會在不同的平臺上做不愉快的事情和不同的不愉快的事情。儘管如此,它仍是一個起點 - 它直接解釋了OP的標題提到的錯誤。 – abarnert

回答

8

幾個側面說明:當你打電話string.replace(string, ""),你告訴字符串以替換其整個自我空字符串,你可能也只是做string = ""。假定第一個string是要替換的搜索字符串,所以給它一個不同的名稱,然後將其用作例如string.replace(searchString, "")。另外,您不想命名變量string,因爲它是標準庫模塊的名稱。你正在調用你的輸入文件「outfile」,這很容易混淆。您可能想要使用with語句而不是顯式關閉。最後,你可以迭代文件中的行,只需for line in f:;你不需要for line in f.readlines()(並且,如果你需要處理的Python 2.x中,你會更樂意迴避readlines(),因爲它會讀取整個文件到內存中,然後使一個巨大的內存中的行列表)。

第一個問題,因爲JBernardo指出,是你已經打開的「一」模式中的文件,這意味着「只寫的,追加到結束。」如果你想讀和寫,你可以使用「a +」或「r +」。

但是,這不會真的幫助你。畢竟,在讀取文件的過程中,您無法寫入文件。

有幾種常見的解決方法。

首先,只寫到標準輸出,並讓用戶做任何他想要的結果,如,它重定向到一個文件。 (在這種情況下,你必須打印提示,「完成」的消息,等等標準錯誤,而不是,所以他們不重定向到文件中。)這是許多Unix工具,如sedsort做的,所以它是適當的如果你正在構建一個Unix風格的工具,但可能不適合其他用途。

def stderrinput(prompt): 
    sys.stderr.write(prompt) 
    sys.stderr.flush() 
    return input() 

def main(): 
    with open(stderrinput("Enter a file name: "), "r") as infile: 
     searchString = stderrinput("Enter the string to be removed: ") 
     for line in infile: 
      print(infile.replace(searchString, "")) 
    sys.stderr.write("Done\n") 

其次,寫入另一個文件。在打開的「R」模式下的輸入文件,並在「W」模式輸出文件,然後你只是拷貝線:

def main(): 
    inpath = input("Enter an input file: ") 
    outpath = input("Enter an output file: ") 
    with open(inpath, "r") as infile, open("outpath", "w") as outfile: 
     for line in infile: 
      outfile.write(line.replace(searchString, "") + "\n") 

三,閱讀和處理內存中的整個文件,然後截斷和重寫整個文件:

def main(): 
    path = input("Enter an input/output file: ") 
    with open(path, "r+") as inoutfile: 
     lines = [line.replace(searchString, "") for line in inoutfile] 
     inoutfile.seek(0) 
     inoutfile.truncate() 
     inoutfile.writelines(lines) 

最後,寫入到一個臨時文件(與第二個選項),然後繼續前進原始輸入文件的頂部該臨時文件。事情是這樣的:

def main(): 
    path = input("Enter an input/output file: ") 
    with open(path, "r") as infile, tempfile.NamedTemporaryFile("w", delete=False) as outfile: 
     for line in infile: 
      outfile.write(line.replace(searchString, "")) 
     shutil.move(outfile.name, pathname) 

這最後一個是有點棘手,因爲POSIX和Windows之間的區別。但是,它有很大的優勢。 (例如,如果你的程序在操作過程中被殺死了,不管它發生了什麼,你可以保證有原始文件或新文件,而不是一些半成文的混亂。)

+0

你應該評論說'string = string.replace(string,「」)'在這個循環中是無稽之談。在第二行,你是替換字符串是第一行。 – mgilson

+0

更糟。在第二行,您的替換字符串是第二行。在每一行中,替換字符串都是當前行。 – abarnert

+0

正確的你! – mgilson