這並不總是一個好主意(或者甚至是可行的)使用readlines()
不帶參數,因爲它會在整個文件中讀取,並可能消耗大量的內存—和做,如果你不可能沒有必要一次不需要所有人,這取決於你在做什麼。
所以,一種方法是使用Python 生成器函數從文件中提取所需的行或值。它們非常容易創建,基本上只需使用yield
語句返回值而不是return
。從編程的角度來看,它們之間的主要區別在於,下次調用函數時,執行將繼續執行yield
語句後面的行,而不是像通常情況下從第一行開始。這意味着它們的內部狀態會在後續調用之間自動保存,這使得在內部進行復雜的處理變得更加容易。
下面是一個非常簡單的例子,它使用一個獲取文件中您想要的數據,每次只增加一行,因此它不需要足夠的內存來保存整個文件:
def read_data(filename):
with open(filename, 'rt') as file:
next(file); next(file) # ignore first two lines
value = next(file).rstrip('\n') # read what should be the first number
while value != '#extra': # not end-of-numbers marker
yield value
value = next(file).rstrip('\n')
for number in read_data('mydatafile'):
# process each number string produced
當然,你還可以收集它們放在一起放入一個列表,如果你願意的話,像這樣:
numbers = list(read_data('mydatafile'))
正如你可以看到它可能做其他有用的東西,在功能,如驗證文件數據的格式或以其他方式對其進行預處理。在上面的例子中,我通過在它返回的列表的每一行中刪除換行字符readlines()
來完成一些操作。通過使用yield int(value)
而不是僅僅yield value
將每個字符串值轉換爲整數也是微不足道的。
希望這會給你足夠的想法,以確定什麼是可能的,以及在決定使用什麼方法來執行手頭任務時所涉及的折衷。
你可以用'read = myfile.read()。splitlines()[2:-2]'幾乎同時去掉換行符。 – martineau
請注意'.strip()'也會去掉任何前導/尾部空格或製表符。你可以使用'number.rstrip(「\ n」)'來避免這種情況。 (這與OP的問題無關,但可能對讀者有用) – bfontaine