簡體   English   中英

讀取並覆蓋Python中的一個文件

[英]Read and overwrite a file in Python

目前我正在使用這個:

f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.close()

但問題是舊文件比新文件大。 所以我最終得到了一個新文件,它的末尾有一部分舊文件。

如果您不想關閉並重新打開文件,為了避免競爭條件,您可以truncate它:

f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.truncate()
f.close()

使用open作為上下文管理器,該功能也可能更清晰、更安全,即使發生錯誤,它也會關閉文件處理程序!

with open(filename, 'r+') as f:
    text = f.read()
    text = re.sub('foobar', 'bar', text)
    f.seek(0)
    f.write(text)
    f.truncate()

fileinput模塊有一個inplace模式,用於在不使用臨時文件等的情況下將更改寫入您正在處理的文件。該模塊很好地封裝了循環遍歷文件列表中的行的常見操作,通過一個透明地跟蹤文件的對象名稱、行號等,如果你想在循環內檢查它們。

from fileinput import FileInput
for line in FileInput("file", inplace=1):
    line = line.replace("foobar", "bar")
    print(line)

text = re.sub('foobar', 'bar', text)之后關閉文件可能會更容易和更整潔,重新打開它進行寫入(從而清除舊內容),然后將更新的文本寫入其中。

我發現閱讀它然后再寫它更容易記住。

例如:

with open('file') as f:
    data = f.read()
with open('file', 'w') as f:
    f.write('hello')

老實說,您可以看看我構建的這個執行基本文件操作的類。 write 方法覆蓋並追加保留舊數據。

class IO:
    def read(self, filename):
        toRead = open(filename, "rb")

        out = toRead.read()
        toRead.close()
        
        return out
    
    def write(self, filename, data):
        toWrite = open(filename, "wb")

        out = toWrite.write(data)
        toWrite.close()

    def append(self, filename, data):
        append = self.read(filename)
        self.write(filename, append+data)
        

對於任何想要按行閱讀和覆蓋的人,請參閱此答案。 https://stackoverflow.com/a/71285415/11442980

filename = input("Enter filename: ")
with open(filename, 'r+') as file:
    lines = file.readlines()
    file.seek(0)
    for line in lines:
        value = int(line)
        file.write(str(value + 1))
    file.truncate()

嘗試將其寫入新文件中..

f = open(filename, 'r+')
f2= open(filename2,'a+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.close()
f2.write(text)
fw.close()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM