Python檔案操作


使用open開啟檔案後一定要記得呼叫檔案物件的close()方法。例如可以用try/finally語句來確保最後能關閉檔案。

file_object = open('thefile.txt')
try:
     all_the_text = file_object.read( )
finally:
     file_object.close( )

註:不能把open語句放在try區塊裡,因為當開啟檔案出現異常時,檔案物件file_object無法執行close()方法。


點擊(此處)折疊或開啟

#coding:utf-8
#!/usr/bin/python
# Filename: fileRW.py
import os

context=""" hello world,hello
"r" 以读方式打开,只能读文件 , 如果文件不存在,会发生异常 
"w" 以写方式打开,只能写文件, 如果文件不存在,创建该文件
                                                     如果文件已存在,先清空,再打开文件"""
def createfileBYwrite(filename):
    f = open(filename,'w') #打开文件open()是file()的别名
    f.write(context) #把字符串写入文件
    f.close() #关闭文件

#注意,调用writelines写入多行在性能上会比使用write一次性写入要高。
def createfileBYwritelines(filename):
    f = open(filename,'w') #打开文件open()是file()的别名
    try:
        f.writelines(context) #把字符串写入文件
    finally: 
        f.close() #关闭文件

def readBYreadline(filename):
    f = open(filename)
    while True:
        line =f.readline()#当文件指针移动到末尾继续readline会出现错误,所以后面要加判断
        if line:
            print line,
        else:
            break
    f.close()

#需要通过循环访问readlines()返回列表中的元素
def readBYreadlines(filename):
    f = open(filename)
    try:
        lines = f.readlines()
        for line in lines:
            print line,
    finally:
        f.close()
    
#从文件中读取所有内容,赋予一个字符串变量
def readBYread(filename):
    f = open(filename)
    try:
        content = f.read()
    finally:
        f.close()
    print content 
    
if __name__== "__main__":
    filename="hello.txt"
    createfileBYwritelines(filename)
    readBYread(filename)
    #把文件删除掉
    if os.path.exists(filename):
        print "文件存在%s" %filename
        os.remove(filename)
    
    
 hello world,hello
"r" 以读方式打开,只能读文件 , 如果文件不存在,会发生异常 
"w" 以写方式打开,只能写文件, 如果文件不存在,创建该文件
                                                     如果文件已存在,先清空,再打开文件
文件存在hello.txt


#2.讀取檔案

讀取文字檔案

input = open('data', 'r')
#第二个参数默认为r
input = open('data')

讀取二進位檔案

input = open('data', 'rb')

 

讀取所有內容

file_object = open('thefile.txt')
try:
     all_the_text = file_object.read( )
finally:
     file_object.close( )

 

讀固定位元組

file_object = open('abinfile', 'rb')
try:
    while True:
         chunk = file_object.read(100)
        if not chunk:
            break
         do_something_with(chunk)
finally:
     file_object.close( )


# # 

讀取每行

list_of_all_the_lines = file_object.readlines( )

如果檔案是文字文件,也可以直接遍歷檔案物件取得每行:

for line in file_object:
     process line
 

3.寫入檔案

寫入文字檔案

output = open('data', 'w')

 

寫二進位檔案


#

output = open('data', 'wb')

 
追加寫檔案
###
output = open('data', 'w+')
###### ######寫入資料######
file_object = open('thefile.txt', 'w')
file_object.write(all_the_text)
file_object.close( )
#### ## ######寫入多行#########
file_object.writelines(list_of_text_strings)
##########注意,呼叫writelines寫入多行在效能上會比使用write一次性寫入要高。 ######在處理日誌檔案的時候,常常會遇到這樣的情況:日誌檔案巨大,不可能一次把整個檔案讀入到記憶體中進行處理,例如需要在一台物理記憶體為2GB 的機器上處理一個2GB 的日誌文件,我們可能希望每次只處理其中200MB 的內容。 ###在 Python 中,內建的 File 物件直接提供了一個 readlines(sizehint) 函數來完成這樣的事情。以下面的程式碼為例:#########
file = open('test.log', 'r') sizehint = 209715200   # 200M position = 0 lines = file.readlines(sizehint) while not file.tell() - position < 0:        position = file.tell()        lines = file.readlines(sizehint)
######


每次呼叫readlines(sizehint) 函數,會傳回大約200MB 的數據,而且所傳回的必然都是完整的行數據,大多數情況下,傳回的資料的位元組數會稍微比sizehint指定的值大一點(除最後一次呼叫readlines(sizehint) 函數的時候)。通常情況下,Python 會自動將使用者指定的 sizehint 的值調整成內部快取大小的整數倍。


一、用Python創建一個新文件,內容是從0到9的整數, 每個數字佔一行:

#python
>>>f=open('f.txt','w')    # r只读,w可写,a追加
>>>for i in range(0,10):f.write(str(i)+'\n')
.  .  .
>>> f.close()


二、文件內容追加,從0到9的10個隨機整數:
#python
>>>import random
>>>f=open('f.txt','a')
>>>for i in range(0,10):f.write(str(random.randint(0,9)))
.  .  .
>>>f.write('\n')
>>>f.close()


三、文件內容追加,從0到9的隨機整數, 10個數字一行,共10行:
#python
>>> import random
>>> f=open('f.txt','a')
>>> for i in range(0,10):
.  .  .     for i in range(0,10):f.write(str(random.randint(0,9))) 
.  .  .     f.write('\n')    
.  .  .
>>> f.close()


四、把標準輸出導向到檔案:
#python
>>> import sys
>>> sys.stdout = open("stdout.txt", "w")
>>>  . . .


五、檔案的讀寫

一、檔案開啟:

f = file(name[, mode[, buffering]])

入口參數: name 檔案名稱

                     選項,字串

#        大小)

傳回值: 文件物件

mode 選項:

"r"   以讀取方式打開,只能讀取文件, 如果檔案不存在,會發生異常      

"w"以寫方式打開,只能寫文件, 如果文件不存在,創建該文件

                         若文件已存在,先清空,再開啟檔案

"rb"   以二進位讀取方式開啟,只能讀取文件, 如果文件不存在,會發生異常      

#"wb" 以二進位寫入的異常      

#"wb" 以二進位寫入                      若已存在,先清空,再開啟文件

"rt"   以文字讀取方式打開,只能讀取文件, 如果文件不存在,會發生異常      

#"wt" 以文字寫方式開啟,只能寫文件, 如果文件不存在,創建該文件

                                   "rb "   以二進位讀取方式開啟,可讀取、寫入文件, 若檔案不存在,會發生異常      

" wb " 以二進位寫方式開啟,可讀取、寫入文件, 若文件不存在,請建立此文件

                            若檔案已存在,先清空,再開啟檔案

二、關閉檔案

f.close()

當檔案讀取完畢後,應關閉檔案。

三、清空檔案內容

f.truncate()

注意:僅當以"r "   "rb "    "w"   "wb" "wb "等以可寫入模式開啟的檔案才可執行此功能。

四、檔案的指標定位與查詢

(1)檔案指標:

      檔案開啟後,其物件保存在f 中,它會記住檔案的目前位置,以便於執行讀取、寫入操作,這個位置稱為檔案的指標( 一個從檔案頭部開始計算的位元組數long 類型)。

(2)文件開啟時的位置:

##      以"r"   "r "   "rb " 讀取方式, "w"   "w "   "wb "寫方式開啟的文件,

     一開始,檔案指標都指向檔案的頭部。

(3) 取得檔案指標的值:

      L = f.tell()

(4) 移動檔案的指標

    

   f.seek(   偏移量, 選項)

      選項=0 時, 表示將檔案指標指向從檔案頭部到"偏移量"位元組處。

      選項 =1 時, 表示將檔案指標指向從檔案的目前位置,向後移動 "偏移量"位元組。

      選項 =2 時, 表示將檔案指標指向從檔案的尾部,,向前移動 "偏移量"位元組。

五、從檔案讀取指內容

   

#1 文字檔案(以"rt"方式開啟的檔案)的讀取  

#

          s = f.readline(     )

        回傳值: s 為一行,從檔案中讀取的字串,並包含行結束符號。

        說明: (1)  如果len(s ) =0 表示已到檔案尾

             

#2 二進位檔案(以"rb"、"rb "、"wb " 方式開啟的檔案)的讀取  

          s = f.read(    n )

#   針對圖片、影片等檔案必須使用b的模式讀寫

     說明: (1)  如果len( s ) =0 表示已到檔案尾

     (       2)   檔案讀取後,檔案的指標向後移動len(s) 位元組。

               (3)為磁軌已壞,且會發生例外。

六、寫入一個字串

   

#    f.write(    s )

##      入的字串

    說明: (1)檔案寫入後,檔案的指標向後移動len(s) 位元組。

                (2)且磁軌已壞,且磁碟已滿會發生例外。

      

#回傳值:s 是字串,從檔案讀取的內容

2、刪除檔案

#import os

os.remove(file)

#