2017-02-14 78 views
2

我已經寫了一個腳本來從外語文本中刪除多餘的空格。當我在Windows命令提示符下執行腳本時,我沒有收到任何錯誤。一切都很完美。但是,我在腳本中指定的輸出文件並未創建,也沒有修改輸入文件。我嘗試爲腳本寫入空白文檔'corpus_1'。然後我試着回寫輸入文件。無論哪種方式,指定的文件保持不變。我如何讓腳本寫入文件?我在代碼中缺少什麼?爲什麼我的腳本不寫入文件?

def lettersWhitespace(): 

    replacements = {' ':' ', 'c ':'c'} 

    with open('C:\\Users\\Charles\\corpus.odt','w+') as infile, open('C:\\Users\\Charles\\corpus_1.odt', 'w') as outfile: 
     for line in infile: 
      for src, target in replacements.iteritems(): 
       line = line.replace(src, target) 
      outfile.write(line) 

編輯:我相信我發現了這個問題。看來我的第一行'def lettersWhitespace():'是多餘的。正如所寫,該腳本正在定義一個函數,但不會調用該函數。這聽起來正確嗎?

+0

'w +'擦除文件。我希望這不是你唯一的副本。 – user2357112

+0

感謝您的意見。我有幾個備份,但我甚至沒有在運行腳本後出現擦除文件。沒有什麼被修改。 然而,當我最終得到這個工作,我應該只是'W'而不是'W +'? –

回答

1

這兩個ww+截斷該文件。假設你有一個包含abc(每一個換行符)的文件:

with open('testfile.txt', 'w') as f: 
    f.write('a\nb\nc') 

,你在r打開它,你可以讀取文件:如果您在w+打開

with open('testfile.txt', 'r') as f: 
    print(f.read()) 
# a 
# b 
# c 

它被截斷(空):

with open('testfile.txt', 'w+') as f: 
    print(f.read()) 
# 

你可能想要一個「非截斷」讀/寫模式明星婷在文件開頭:r+(或者,如果你想要的文件句柄是在文件的結尾:a+

with open('testfile.txt', 'r+') as outp, open('testfile.txt', 'r') as inp: 
    for line in inp: 
     line = line.replace('a', 'b') 
     outp.write(line) 

其修改文件爲你寫:

with open('testfile.txt', 'r') as f: 
    print(f.read()) 
# b 
# b 
# c 

可以在this StackOverflow answer of @And找到文件模式的非常方便的摘要。

+0

謝謝。我是一個新手,已經將'w'理解爲'寫','r'理解爲'讀','a'理解爲'追加','+'理解爲'讀寫'。它開始看起來更像圖片,所以我將深入研究一些關於文件打開命令的教程。 對於有問題的腳本,是否顯示這確實是我的源文本未被更改的原因?我還想知道python是否難以處理不在.txt文件中的文本? (我正在使用.odt文件作爲我的輸入和輸出。) –

+0

@CharlesR在Windows中,二進制文件和原始數據文件之間存在差異,可能需要以'b'-模式打開文件(只需將' b''的地方到'rb +'這樣的模式,不知道'.odt'文件是否是二進制文件,我也有點困惑,它有效嗎?請注意,如果這個文件完全回答你的問題,請不要忘記[接受它](http://stackoverflow.com/help/accepted-answer)。 – MSeifert

+0

我還沒有找到一種方法來使它工作。剛纔我試着改變模式爲rb +。我也切換到使用一個.txt文件用於測試目的,另外,我嘗試將嵌套的'for'語句註釋掉,並將輸出方法更改爲print()。但是,除了我的shell接受查詢並給我一個新命令線。這是我最近的測試: 高清lettersWhitespace(): 開放( 'C:\\ \\用戶\\查爾斯Test.txt的', 'RB +')爲INFILE: 線路infile中: 打印(線) –

相關問題