2013-10-02 37 views
1

我想用文件中的空白替換某一格式的所有行,即替換一行數字/數字/數字(如日期)和數字:數字(如時間)與「」。我想從舊文件讀取,然後將清理過的版本保存爲新文件。字符串替換和保存到新文件(Python v2.7)

這是我到目前爲止的代碼(我知道這是遙遠):

old_file = open("old_text.txt", "r") 
new_file = open("new_text.txt", "w") 

print (old_file.read()) 

for line in old_file.readlines(): 
    cleaned_line = line.replace("%/%/%", "") 
    cleaned_line = line.replace("%:%", "") 
    new_file.write(cleaned_line) 

old_file.close 
new_file.close 

感謝你的幫助, 本

+2

將'old_file.close'改爲'old_file.close()'對於new_file相同 –

+1

[''with'命令的這個問題將會很方便](http://stackoverflow.com/questions/9282967/how-to -open-a-file-using-the-open-with-statement) – 2013-10-02 00:14:08

+0

你在for循環中不需要'old_file.readlines():'。你可以在'old_file'中輸入':老實說,在我讀代碼之前,我甚至都不知道'readlines'甚至是存在的。 – Shashank

回答

0

首先,有一些壓痕問題,其中for循環沒有理由縮進。其次,只要你搜索到的文件到最後,所以沒有更多的行要閱讀。最後,with命令允許您打開一個文件並聲明其變量名稱,並允許它由於錯誤或讀到最後而關閉,而不必擔心手動關閉它。

但是,要執行實際邏輯,您可能需要使用regular expression。您可以使用re.search()找到任何數量的數字,一個冒號和三批任意數量的數字的,它們之間文字/任何號碼數字

  • \d+\/\d+\/d+格局

    • \d+:\d+

    你想要的代碼是接近這個:

    import re 
    with open("old_text.txt", "r") as oldfile, open("new_text.txt", "w") as new_file: 
        for line in old_file: 
         # This will match if this pattern is anywhere in the line 
         if re.search("\d+:\d+", line) is not None: 
          line = "" 
         # This will match if this pattern is anywhere in the line 
         if re.search("\d+\/\d+\/d+", line) is not None: 
          line = "" 
         new_file.write(line) 
    

    如果你只是想匹配在該行的開頭,re.match()將可能是一個更好的選擇。

    在這裏,我們宣佈一個塊與我們的兩個文件,通過old_file循環,清理每一行並寫入new_file。一旦到達old_file的末尾,所有文件都完全關閉。如果找不到任何文件或發生錯誤,那麼with塊會捕獲這些文件並很好地發佈所有文件。

  • +2

    'readlines()'在這裏除了性能問題外沒有添加任何東西;只需在'old_file:'中輸入'。 – abarnert

    +2

    更重要的是,我不認爲這實際上解決了OP的問題。從他的描述來看,他希望將所有行與格式編號/數字/編號匹配,而不是所有行都使用字符串'%/%/%',這是他不知道該怎麼做的部分。 – abarnert

    +0

    @abarnert更新爲包含數字匹配邏輯。 – 2013-10-02 00:31:46

    1

    我想用文件中的空白替換某一格式的所有行,即用「」替換一行數字/數字/數字(如日期)和數字:數字(如時間) 。

    您不能使用str.replace來匹配模式或格式,只能使用文字字符串。

    要匹配一個模式,你需要某種解析器。對於這樣的模式,標準庫中內置的正則表達式引擎re已經不夠強大了......但您需要學習如何爲您的模式編寫正則表達式。如果您已經瞭解基礎知識,那麼參考文檔和Regular Expression HOWTO非常棒;如果沒有,你應該在其他地方搜索教程。

    總之,這裏的你如何做到這一點(沿途固定一些其他的東西,大多由樂高Stormtroopr解釋):

    import re 
    
    with open("old_text.txt") as old_file, open("new_text.txt", "w") as new_file: 
        for line in old_file: 
         cleaned_line = re.sub(r'\d+/\d+/\d+', '', line) 
         cleaned_line = re.sub(r'\d+:\d+', '', cleaned_line) 
         new_file.write(cleaned_line) 
    

    另外請注意,我在第二sub使用cleaned_line ;再次使用line,就像在你的原始代碼中一樣,意味着我們失去了第一次替換的結果。

    不知道你的問題的確切定義,我不能保證這確實是你想要的。你是否想要刪除包含模式編號/編號/編號的所有行,將所有沒有任何內容的行全部清空但是表示該模式,只顯示該模式並將該行的其餘部分單獨留空?所有這些都是可行的,很容易,re,但他們都做了一點不同。


    如果你想獲得一些技巧,你可以使用一個re.sub表達式替換所有匹配線,空行的一次,而不是迭代他們一次一個。這意味着稍微更復雜的正則表達式與略微更簡單的Python代碼相比,這意味着對於中等大小的文件可能會有更好的性能,但對於大型文件而言性能(以及上限)會更差,等等。如果你不知道如何自己編寫合適的表達式,並且沒有性能瓶頸可以解決,我會堅持使用顯式循環。

    +0

    我正在尋找所有包含格式數字/數字/數字或數字:數字的字符串的所有行。我相信我可以從你和樂高Stormtroopr的答案中找出應該做些什麼。感謝您的快速回復。 – Ben