2014-03-04 36 views
0

我試圖用值替換零。到目前爲止,這是我的代碼,但接下來我該做什麼?我如何替換python中的文件中的特定值

g = open("January.txt", "r+") 
for i in range(3): 
     dat_month = g.readline() 

Month: January 
Item: Lawn 
Total square metres purchased: 
0 
monthly value = 0 

回答

0

可以做到這一點 - 但這不是通常的做法,當然不是文本文件的正確方法。

正確的方法是編寫另一個文件,其中包含要更新的信息,然後將新文件重命名爲舊文件。這是使用文本文件進行此操作的唯一理想方法,因爲字段的信息大小(以字節爲單位)是可變的。至於你「寫入200字節到磁盤」而不是單個字節,改變你的值,不要讓它愚弄你:在操作系統級別,所有的文件訪問都必須完成以塊爲單位,通常是幾千字節(在特殊情況下,並且可能是幾百字節的文件系統)。無論如何,在用戶空間程序中,您絕不會像Python這樣的高級語言中觸發少於幾百字節的磁盤寫入。現在

,爲代碼:

import os 
my_number = <number you want to place in the line you want to rewrite> 
with open("January.txt", "r") as in_file, open("newfile.txt", "w") as out_file: 

    for line in in_file: 
     if line.strip() == "0": 
      out_file.write(str(my_number) + "\n") 
     else: 
      out_file.write(line) 

os.unlink("January.txt") 
os.rename("newfile.txt", "January.txt") 

所以 - 這是一般的想法 - 當然 你不應該寫在那樣硬編碼的所有值碼(即值進行檢查和書面固定在程序代碼中,就像文件名一樣)。

至於with聲明 - 這是語言至極的特殊構造是非常合適oppening文件和塊,然後操縱,像在這種情況下 - 但它不是需要

編程之餘,你必須記住的概念是這樣的: 當您使用的應用程序,讓您編輯一個文本文件,電子表格,圖像,你,作爲用戶,可能有印象那完成並保存完成後,更新內容爲,該文件與同一個文件共享。在絕大多數用例中,不會發生什麼:應用程序在內部使用了一個像我上面介紹的模式 - 完全新文件被寫入到磁盤,舊的被刪除或重命名。少數例外可以是簡單的數據庫應用程序,它可以取代文件本身內的更新固定寬度字段。現代數據庫當然不會這樣做,只是將最新的更新信息附加到文件末尾。 PDF文件是另一種不是被設計成在每次更新時被完全替換的文件,而是在這種情況下,更新後的信息被寫在文件的末尾,即使更新要在頁面中進行在呈現的文檔的開始處。

+0

感謝您的代碼,但我即將在gcse級別進行python編程。我明白你在說什麼,但我主要避免老師還沒有教過我們的東西,例如導入操作系統和使用與功能,我不太確定它做什麼。 我已經完成了這項任務,而且我確實按照你所說的指導做了一些事情。我所做的是我讀取文件(0),然後我將它保存在一個變量中,然後我完全重寫了文件。 我的老師解決方案與在Python中使用sql有關 抱歉,遲到的答覆,沒想到這樣一個好的答案 – user2273795

+0

如果你是一個開瓶器,不試圖替換文件的值是兩倍重要。堅持創建一個新文件 - 這是程序的工作方式。對於初學者,'with'語句可以是「可選的」,只需打開輸入文件進行讀取和輸出文件進行寫入即可。不管你的techaer向你展示了'os'模塊,你都可以通過自己學習獲得更多的收穫。 – jsbueno

0
dat_month = dat_month.replace("0", "45678") 

寫信給你做一個文件:

with open("Outfile.txt", "wt") as outfile: 

然後

outfile.write(dat_month) 
+0

也許問題是關於寫更換回原來的文件 – wap26

+0

OK,補充有關信息了。 –

0

試試這個:

import fileinput 
import itertools 
import sys 
with fileinput.input('January.txt', inplace=True) as file: 
    beginning = tuple(itertools.islice(file, 3)) 
    sys.stdout.writelines(beginning) 
    sys.stdout.write(next(file).replace('0', 'a value')) 
    sys.stdout.write(next(file).replace('0', 'a value')) 
    sys.stdout.writelines(file) 
相關問題