首先,我不建議你命名變量file
因爲file()
是一個內置的別名在Python中open()
功能。你可以這樣做。但我建議不要這麼做,因爲許多Python程序員在看到它時會感到畏懼。
也許「in_filename」爲輸入文件名,「inputfile」爲file()
對象。
更重要的是,一旦你打開了文件,你必須調用它的方法(顯式或隱式)才能使用文件的內容。
有幾種方法可以做到這一點。 (正如其他人所指出的,你應該使用os.path.join()
的路徑便攜相結合,基本文件名):
#!python
import os
path = '/some/path'
in_filename = 'somefile.txt'
inputfile = open(os.path.join(path, in_filename), 'r')
data = inputfile.read() # fetch all contents in one string
inputfile.seek(0) # reset file object point to beginning of file
data_lines = inputfile.readlines() # fetch all contents as list of lines
inputfile.seek(0) # rest file object again
while True:
line = inputfile.readline() # one line at a time (line is a string)
if not line:
break # length of line is zero at end of file
# Note: empty strings are "False" in Python; so this detects EOF
inputfile.close() # close inputfile
# alternatively using "context management" features
with open(os.path.join(path, in_filename), 'r') as infile:
for line in infile:
do_something(line)
# infile is implicitly closed on exit from the context management "suite"
# (indented block of code)
在此示例中,我展示瞭如何在整個文件作爲一個字符串發出聲音;如何將它作爲行列表,如何逐行迭代以及如何使用「上下文管理器」(with
語句)逐行迭代它。
請注意,迭代過一個文件是含蓄調用.readline()
(單數)方法。 (這實際上與我們用來打開它的with
上下文管理是正交的,with
只保證在我們的縮進代碼塊結束之後文件會自動關閉......即使某些異常是由開放或任何其他操作引發的我們對它進行了預處理。for ... in ...:
創建並使用迭代器;並且Python中的許多對象定義了迭代語義。對於基於.readline()
的調用的文件)
我也在向您展示如何.seek()
回到文件的開頭(這可能不會經常執行,但在這種情況下,它是一種顯示所有這些替代閱讀方式的方法該文件不必重複.close()
並重新打開它)。
請注意,我明確地使用我的open()
調用中的訪問選項來聲明我的文件處理程序將是隻讀的。如果我想讀取和寫入文件,我會使用'w+'
等)。
我沒有顯示.read()
方法的選項,該方法允許您指定您希望爲每個呼叫讀取的數據量。對於普通的文本文件,這通常不是很有用,因爲那樣你就不得不自己處理任何部分代碼,而這些代碼很雜亂。如果您嘗試使用我的示例來閱讀一些非常大的文件,那麼您可能會導致系統進行頁面切換,並在您的系統中出現嚴重的性能和響應問題。 (在典型的現代化筆記本電腦上,只要文件大小不超過1 GB或2個,就可以正常工作)。
如果您有一個包含固定長度記錄(文本或二進制文件)的文件,使用.read(xxx)
(具有特定數量的字符可供任何調用讀取)可能很有用。然而,現在很少有人使用Python或其他腳本語言來操縱固定長度的文件結構。如果您正在處理非文本文件(例如操作MP3文件或圖像等的頭文件,那麼您可能會使用這種方法(並且您可能還想使用struct
模塊來「打包」來自其文件的數據文本表示到您的二進制文件格式所需的特定機器本機表示中)
雖然您應該查看一下使用'os.path.join'(可能'with with'作爲上下文管理器文件), – sapi 2014-09-30 09:23:44
你的文件已經打開,請閱讀[this](https://docs.python.org/2/tutorial/inputoutput.html)並使用文件 – 2014-09-30 09:25:08
你收到了什麼錯誤? 'inputfile'不是字符串,而是整數或其他類型,在這種情況下,在將它們與'+'連接在一起之前,您應該使用'str(machine)'或'str(inputfile)'將其轉換爲字符串 – jdehesa 2014-09-30 09:27:04