打開文件
要打開的文件應該存儲在你運行的python程序同一個文件夾下。
這個文件存儲在你啓動Python時所在的那個文件夾。
>>> fhand = open('mbox.txt')
>>> print fhand
<open file 'mbox.txt', mode 'r' at 0x1005088b0>
如果文件成功被打開, 操作系統會返回一個文件句柄。
如果文件不存在, 打開失敗, 輸出追蹤錯誤信息。
文本文件與文本行
文本文件可視爲若干文本行的序列,這與Python字符串是字符的序列道理相同。
郵件交流:文件中包含多條郵件, 遵守一種標準格式。 以“From ”開頭的行是每一條郵件第一行, 以“From:” 開頭的行是郵件的一部分, 注意區分。
將文本文件分解成文本行, “一行的結束”用專門的字符來表示, 稱爲換行符。常用換行符 \n 。
讀取文本行
雖然文件句柄並不包含文件的數據, 但它可以方便地構建一個for循環, 按行依次讀取文件。
fhand = open('mbox.txt')
count = 0
for line in fhand:
count = count + 1
print 'Line Count:', count
python open.py
Line Count: 132045
for循環中文件句柄被當做序列來使用。 for循環只是簡單地計算並輸出文件的行數。可翻譯成:“每遇到文件中的一行( 表示爲文件句柄) , 將count變量值加一”。
以for循環這種方式讀取文件時, Python根據換行符將文件數據分成若干文本行。 每次迭代中將換行符作爲一行的最後一個字符。
如果文件大小相對於內存容量來說很小, 那麼就可以把它當做一個字符串, 在文件句柄上使用read方法一次性讀取進來。
>>> fhand = open('mbox-short.txt')
>>> inp = fhand.read()
>>> print len(inp)
94626
>>> print inp[:20]
From stephen.marquar
以這種方式讀取文件時, 所有的文本行和換行符被當做一個整體, 作爲一個大字符串存儲在inp變量中。 只有當計算機內存能夠承載文件數據大小的情況下, 才能用這種方式打開文件。
搜索文件
將文件讀取與字符串方法結合。
例, 讀取一個文件並把以“From:”開頭的行打印出來。 我們可以使用字符串startswith方法來選擇符合前綴要求的行。
fhand = open('mbox-short.txt')
for line in fhand:
if line.startswith('From:') :
print line
From: [email protected]
From: [email protected]
From: [email protected]
From: [email protected]
每一行都以換行符結束, 因此print語句輸出的變量line中的字符串帶有一個換行符, print輸出時本身還會增加一個換行符。所以會出現空行。…
我們可以使用字符串分割來打印出不含最後一個字符的文本行, 不過還有一個更簡單的辦法, 使用rstrip方法截掉字符串後面的空白符, 程序代碼如下所示:
fhand = open('mbox-short.txt')
for line in fhand:
line = line.rstrip()
if line.startswith('From:') :
print line
程序運行結果如下:
From: [email protected]
From: [email protected]
From: [email protected]
From: [email protected]
...
continue語句來編寫搜索循環的思路: 搜索循環的基本思路是尋找“感興趣的”行,跳過“不感興趣的”行。 當找到感興趣的的文本行, 執行相應的操作。
fhand = open('mbox-short.txt')
for line in fhand:
line = line.rstrip()
# Skip 'uninteresting lines'
if not line.startswith('From:') :
continue
# Process our 'interesting' line
print line
用find方法模擬文本編輯器查找功能:
find方法可以尋找一個字符串在另一個字符串中出現的次數, 也可以返回字符串的位置或-1( 表示字符串沒有找到) 。編寫一個循環, 找到包含“@uct.ac.za”字符串的文本行。
fhand = open('mbox-short.txt')
for line in fhand:
line = line.rstrip()
if line.find('@uct.ac.za') == -1 :
continue
print line
讓用戶選擇文件名
fname = raw_input('Enter the file name: ')
fhand = open(fname)
使用try.except與open
fname = raw_input('Enter the file name: ')
try:
fhand = open(fname)
except:
print 'File cannot be opened:', fname
exit()
count = 0
for line in fhand:
if line.startswith('Subject:') :
count = count + 1
print 'There were', count, 'subject lines in', fname
exit()函數會終止程序, 這個程序永不返回值。 質量保障(QA)。
寫入文件
爲了能夠寫入文件, 需要在打開文件時使用“w”作爲第二個參數。
>>> fout = open('output.txt', 'w')
>>> print fout
<open file 'output.txt', mode 'w' at 0xb7eb2410>
如果文件已經存在, 以寫入模式打開文件, 這樣會刪除舊數據, 因此請謹慎使用。 如果文件不存在, 那麼會創建一個新的文件。
文件句柄對象的write方法把數據寫入文件。
>>> line1 = 'This here's the wattle,\n'
>>> fout.write(line1)
在結束一行時, 確保已明確插入了換行符。 print語句會自動加上一個換行符, 而write方法不會這樣做。
>>> line2 = 'the emblem of our land.\n'
>>> fout.write(line2)
當文件寫入完成, 記得關閉文件, 確保寫入物理磁盤, 這樣斷電後數據纔不會丟失。
>>> fout.close()
以讀方式打開文件也要記得關閉文件。 只顧打開新文件就顯得有點粗心大意了。 Python會在程序結束時, 確認所有打開的文件被關閉了。 當寫入文件時, 我們要對文件關閉進行明確聲明, 確保萬無一失。
調試
內置函數repr可以解決空格符、 製表符和換行符等空格帶來的問題。 它將任一對象作爲參數, 返回該對象的一個字符串表示。 這對調試很有幫助。
>>> s = '1 2\t 3\n 4'
>>> print s
1 2 3
4
>>> print repr(s)
'1 2\t 3\n 4'
另一個可能遇到的問題是, 不同的操作系統使用不同的字符來表示一行的結束。 一些操作系統使用換行符\n, 一些操作系統使用返回字符\r, 還有一些操作系統兩者都使用。 如果在不同的操作系統之間轉移文件, 這些差異可能會導致錯誤發生。絕大多數操作系統都提供格式轉換的應用。 詳細信息和更多疑問請訪問 http://wikipedia.org/wiki/Newline。