Python學習筆記 - 6.文件

打開文件

要打開的文件應該存儲在你運行的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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章