簡體   English   中英

在 python 中第二次讀取文件時出現問題

[英]Issues while reading a file for second time in python

我有點困惑為什么以下代碼片段在第二次讀取同一個文件時返回正確的 output :

textCont = "Hello World"
print("Original content of the file")
print(open(filename).read())
textFile = open(filename, "w")
textFile.write(textCont)
print("New file content:")
textFile = open(filename)
print(textFile.read())
textFile.close()

其中filename是包含一些現有數據的文件。 該文件將被讀取、覆蓋然后再次讀取。

在上述情況下,相同的變量已用於以寫入模式打開文件,然后以讀取模式打開文件。 這工作正常,並在第二次讀取時給出正確的 output(顯示已覆蓋前一個的內容)

但是以下版本的代碼不起作用:

textCont = "Hello World"
print("Original content of the file")
print(open(filename).read())
textFile = open(filename, "w")
textFile.write(textCont)
print("New file content:")
textFile_1 = open(filename)
print(textFile_1.read())
textFile.close()
textFile_1.close()

當第二次使用變量而不是用於以寫入模式打開文件的變量完成讀取時,它返回一個空字符串。

我知道當第二次讀取同一個文件時,它返回一個空字符串。 但是為什么第一種情況下的代碼會返回正確的 output?

誰能提供一個合適的解釋?

多虧了@Stefan,第二種情況的問題得到了解決。

解決方案是在寫入后但再次讀取之前關閉文件。

print(open(filename).read())
textFile = open(filename, "w")
textFile.write(textCont)
textFile.close() // close the file from write mode before reading it again
print("your file content:")
textFile_1 = open(filename)
print(textFile_1.read())
textFile_1.close()

首先要了解的是,當您執行 textFile.write 時,無法確定寫入文件會立即發生。 這是通過將數據首先放在緩沖區中來提高寫入效率,該緩沖區僅在文件已滿或調用刷新或文件關閉(內部執行刷新)時才會寫入文件。

(從技術上講,flush 不足以確保將數據寫入文件,請參見os.fsync

所以原因是不適用於兩個不同的變量名稱是因為寫操作在textFile_1.close()行之前從未真正發生過

它使用相同變量名“工作”的原因是,當您重新綁定textFile = open(filename)時,以前綁定到textFile的文件現在沒有在任何地方引用,因此垃圾收集器將其刪除。 當文件句柄被刪除時,數據被寫入文件,因此您可以在之后讀取它。

此外,您應該在處理文件時使用 with open 習慣用法: link

見下文,FileDebug 包裝器會向您顯示文件何時被刪除以及數據何時被寫入。

class FileDebug:
    def __init__(self, f, name):
        self.f = f
        self.name = name

    def close(self):
        print(f"Closing file (var: {self.name})")
        self.f.close()

    def write(self, *args, **kwargs):
        self.f.write(*args, **kwargs)

    def read(self, *args, **kwargs):
        return self.f.read(*args, **kwargs)

    def __del__(self):
        print(f"Del completed (var: {self.name})")

filename = "text.txt"
def different_name():
    textCont = "Hello World"
    print("Original content of the file")
    print(FileDebug(open(filename), "No name").read())
    textFile = FileDebug(open(filename, "w"), "textFile")
    textFile.write(textCont)
    print("New file content:")
    textFile_1 = FileDebug(open(filename), "textFile_1")
    print(textFile_1.read())
    textFile.close()
    textFile_1.close()

def same_name():
    textCont = "Hello World"
    print("Original content of the file")
    print(FileDebug(open(filename), "No name").read())
    textFile = FileDebug(open(filename, "w"), "textFile")
    textFile.write(textCont)
    print("New file content:")
    textFile = FileDebug(open(filename), "textFile")
    print(textFile.read())
    textFile.close()


different_name()
"""
Original content of the file
Del completed (var: No name)

New file content:

Closing file (var: textFile)
Closing file (var: textFile_1)
Del completed (var: textFile)
Del completed (var: textFile_1)
"""

#same_name()
"""
Original content of the file
Del completed (var: No name)

New file content:
Del completed (var: textFile) # the file is closed and the data is written
Hello World
Closing file (var: textFile)
Del completed (var: textFile)
"""

暫無
暫無

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

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