解決您的才能問題,
「這有什麼錯print(open(file).readlines())
?」
那麼,你使用它後丟棄文件對象,所以你不能close
它。是的,Python最終會自動關閉您的文件,但按照其條款而不是您的文件。如果您只是在shell或終端中玩遊戲,這可能很好,因爲您的會話可能會很短,並且通常不存在任何資源對文件的競爭。但是,在生產環境中,在腳本的整個生命週期中將文件句柄保留爲打開狀態可能會對性能產生破壞性影響。
至於創建一個接收文件對象並寫入它的函數,那麼這基本上就是file.write
。考慮一個文件句柄是一個包含方法的對象,並且這些場景後面的方法以self
(即對象)作爲第一個參數。所以編寫自己已經是一個函數,它需要一個文件句柄並寫入它!如果你願意,你可以創建其他功能,但你基本上重複了默認行爲,而沒有實際的好處。
考慮你的第一個功能看起來有點像這樣:
def write_to(file_handle, text):
return file_handle.write_to(text)
但如果我叫file_handle
self
呢?
def write_to(self, text):
return self.write(text)
現在,它看起來像一個方法,而不是一個獨立的功能。事實上,如果你這樣做:
f = open(some_file, 'w') # or 'a' -- some write mode
write_to = f.write
你有幾乎相同的功能(只是綁定到特定的file_handle)!
作爲練習,您還可以在Python中創建自己的上下文管理器(與with
語句一起使用)。您可以通過定義__enter__
和__exit__
來完成此操作。因此從技術上講,你可以重新定義這個問題,以及:
class FileContextManager():
def __init__(self, filename):
self.filename = filename
self._file = None
def __enter__(self):
self._file = open(self.filename, 'w')
def __exit__(self, type, value, traceback):
self._file.close()
,然後用它喜歡:
with FileContextManager('hello.txt') as filename:
filename.write('Hi!')
,它會做同樣的事情。
所有這一切只是說如果您需要重新實現並添加到默認行爲,Python足夠靈活地完成所有這些工作,但在標準情況下,這樣做並沒有真正的好處。
就你的例子中的程序而言,在微不足道的情況下,幾乎沒有任何錯誤。但是,你缺少與聲明在主函數中使用了一個機會:如果你想一個函數,需要一個文件句柄作爲參數
def main():
with open('file.txt') as filename:
while some_condition:
filename.write('some text')
# file closed here after we fall off the loop then the with context
if __name__ == '__main__':
main()
:
def write_stuff(file_handle, text):
return file_handle.write(text)
def main():
with open('file.txt', 'w') as filename:
while some_condition:
write_stuff(filename, 'some text')
# file closed here after we fall off the loop then the with context
if __name__ == '__main__':
main()
同樣,你可以做很多不同的方式,所以你最想做什麼?什麼是最可讀的?
「我應該在函數中打開一個文件並將指針傳遞給其他人以寫入,還是應該將其聲明爲模塊變量?」
那麼,正如你所看到的,要麼工作。這個問題與上下文高度相關,通常情況下,最佳實踐決定讓文件在最短時間內處於最小合理範圍。因此,什麼需要訪問您的文件?如果模塊中有很多東西,模塊級別的變量或類可能是一個好主意。再次,在微不足道的情況下,就像上面那樣使用with
。
順便說一句,在直截了當的答案在標題中提出的問題是這樣的:'開放(「file.txt的」,「W」)爲f:F .write('some text')'用於寫入或用'open('file.txt')作爲f:contents = f.read()'來讀取。 – 2015-02-23 19:26:06