[Python ] python中文件的基本操作

原文地址: http://blog.163.com/qimeizhen8808@126/ 這女孩寫的挺好,有值得學習的地方。 

 1) 文件的打開和創建,關閉

 a)文件的打開和創建
主要有兩個open()和file()兩個方法。它們的功能是提供了初始化輸入/輸出(I/O)通用接口.
 
格式:file(name, mode [, buffering]] )
name:文件名稱,相對路徑和絕對路徑都可以。
mode: 表示打開的模式,後面具體的介紹
buffering: 表示訪問文件所採用的緩衝方式,其中0表示不緩衝,1表示只緩衝一行數據,> 1表示緩衝區的大小
 
mode模式:
r  以讀方式打開
w  以寫方式打開 (必要時清空, 沒有則創建)
a  以追加模式打開 (從 EOF 開始, 必要時創建新文件)
r+ 以讀寫模式打開
w+ 以讀寫模式打開
a+ 以讀寫模式打開
b  打開二進制的文件。可以與 r, w,a, + 結合使用
U  支持所有的換行符號。 “ \r”, “\n”,“\r\n”
 
總結: 
  1)使用 'r' 或 'U' 模式打開的文件必須是已經存在的
  2)使用 'w' 模式打開的文件若存在則首先清空, 然後(重新)創建
  3)以 'a' 模式打開的文件是爲追加數據作準備的, 所有寫入的數據都將追加到文件的末尾.
舉幾個簡單的示例:
---------r操作----------------------------------------------
>>> p=file("/home/jane/a.t","r")
>>> p.read()
'hello\nhello world\nhello world hello world\n\n'
>>> p.read(-1)  #這裏可以看出read()每次打開文件後,只能讀取一次
''
>>> p.read(-1)
'hello\nhello world\nhello world hello world\n\n' #這裏對-1我不是很明白!文件將被讀取直至末尾
>>> p=file("/home/jane/a.t","r")
>>> p.read(2)  #每次讀取兩個字節
'he'
>>> p=file("/home/jane/a.t","r")
>>> p.read(1)  #每次讀取一個字節
'h'
---------r+操作--------
>>> p=file("/home/jane/aa","r+")
>>> p.write("good")
>>> p.close()
>>> 
這裏向aa文件中,寫入並追加了good
[jane@h3idan ~]$ tail -f aa
goodabc
aaaabbbbccc
123456777888
---------w操作(清空文件)--------
>>> p=file("/home/jane/aa","w")
>>> p.write("good")
>>> p.write("good")
>>> p.close()
這時監控中斷,並且從新查看值的時候,文件被清空,同時寫入了兩個good
[jane@h3idan ~]$ tail -f aa
goodabc
aaaabbbbccc
123456777888
tail: aa:文件已截斷
[jane@h3idan ~]$ tail -f aa
goodgood
---------w+操作(清空文件)--------
>>> p=file("/home/jane/aa","w+")
>>> p.write("earth")
>>> p.close()
清空了文件,並寫入了earth
[jane@h3idan ~]$ tail -f aa
goodgoodtail: aa:文件已截斷
^C
[jane@h3idan ~]$ tail -f aa
earth
---------a+操作(清空文件)--------
>>> p.close()
>>> p=file("/home/jane/aa","a+")
>>> p.write("good")
>>> p.close()
>>> p=file("/home/jane/aa","a+")
>>> p.write("good")
>>> p.close()
>>> 
寫入並追加文件
[jane@h3idan ~]$ tail -f aa
earthgoodgood
 
需要思考:
w和w+的區別,w:寫入並清空,w+讀寫並清空,這地方卻沒有明確看出運行時有什麼區別!
r+和a+的區別: 他們都是讀取並寫入,a+可以追加(末尾加),但是r+是加在最前面
 
b)文件的關閉
close :FileObject.close() 關閉打開的文件對象
 
(2)文件的內建方法:
文件方法可以分爲四類: 輸入, 輸出, 文件內移動, 以及雜項操作。如下表--文件對象的內建方法: 
file.close()--關閉文件
file.fileno()--返回文件的描述符(file descriptor ,FD, 整數值)
file.flush()--刷新文件的內部緩衝區
file.isatty()--判斷 file 是否是一個類 tty 設備
file.next()--返回文件的下一行
file.read(size=-1)---從文件讀取 size 個字節, 當未給定 size 或給定負值的時候, 讀取剩餘的所有字節, 然後作爲字符串返回
        上述定義不是很好理解,不如這個來的好:size: 讀出文件的前 [size] 個字符 , 並輸出給字符串,此時文件的指針指向 size 處
file.readline(size=-1)---從文件中讀取並返回一行(包括行結束符), 或返回最大 size個字符
file.readlines(sizhint=0)--讀取文件的所有行並作爲一個列表返回(包含所有的行結束符);
file.seek(off, whence=0)--在文件中移動文件指針, 從 whence ( 0 代表文件其始, 1 代表當前位置, 2 代表文件末尾)偏移 off 字節
file.write(str)---向文件寫入字符串
file.writelines(seq)---向文件寫入字符串序列 seq
 
1)文件讀取
read() 方法用來直接讀取字節到字符串中, 最多讀取給定數目個字節. 如果沒有給定 size參數(默認值爲 -1)或者 size 值爲負, 文件將被讀取直至末尾.
readline() 方法讀取打開文件的一行(讀取下個行結束符之前的所有字節). 然後整行,包括行結束符,作爲字符串返回.
readlines() 方法它會讀取所有(剩餘的)行,然後把它們作爲一個字符串列表返回. 
eg: 
>>> p=file("/home/jane/a.t","r")
>>> p.read()
'hello\nhello world\nhello world hello world\n\n'
>>> p=file("/home/jane/a.t","r")
>>> p.readline()
'hello\n'
>>> p=file("/home/jane/a.t","r")
>>> p.readlines()
['hello\n', 'hello world\n', 'hello world hello world\n', '\n']
>>> 
我的a.t文件內容爲: 
hello
hello world
hello world hello world
 
2)文件寫入
write() 方法它把含有文本數據或二進制數據塊的字符串寫入到文件中去.
writelines() 方法是針對列表的操作, 它接受一個字符串列表作爲參數, 將它們寫入文件. 行結束符並不會被自動加入, 所以如果需要的話, 你必須在調用writelines()前給每行結尾加上行
 
結束符.
eg: 
-----write()------
>>> p=file("/home/jane/aa","w+")
>>> p.write("hello world")
>>> p.close()
>>> 
這是aa文件的內容爲:
[jane@h3idan ~]$ tail -f aa
hello world
-----writelines()------
>>> p=file("/home/jane/aa","w+")
>>> p.writelines(["a","b","c","d"])
>>> p.close()
>>> 
這時候aa文件內容爲:
[jane@h3idan ~]$ tail -f aa
abcd
 
3)內容查找和替換
文件的查找和替換是和循環相關的,給出個題目:a)計算a.t中所有hello的數目,b)將所有的hello 替換成good
a.t的文檔內容爲:
[jane@h3idan ~]$ cat a.t 
hello
hello world
hello world hello world
【a解答】
#!/usr/bin/python
# n is hello number
# i is hello number in eachline
import re
a=file("/home/jane/a.t","r")
n=0
for i in a.readlines():
        p=re.findall("hello",i)
        print p
        if len(p)>0:
                n=n+len(p)
print n
a.close()
 或者
#!/usr/bin/python
import re
a=file("/home/jane/a.t","r")
n=0
for i in a.readlines():
        str=r"hello"
        p=re.findall(str,i)
        print p
        if len(p)>0:
                n=n+len(p)
print n
a.close()
 
【b解答】
#!/usb/bin/python
import re
a=file("/home/jane/a.t","r")
b=file("/home/jane/a2.t","w")
for i in a.readlines():
        b.write(i.replace("hello","good"))
a.close()
b.close()
 
[jane@h3idan ~]$ cat a2.t 
good
good world
good world good world
 
4)其他 
seek(off, whence=0) 方法可以在文件中移動文件指針到不同的位置
next():FileObject.next()返回當前行,並將文件指針到下一行
 
(3)目錄操作
對文件系統的訪問大多通過 Python 的 os 模塊實現. 該模塊是 Python 訪問操作系統功能的主要接口. os 模塊實際上只是真正加載的模塊的前端, 而真正的那個"模塊"明顯要依賴與具體的
 
操作系統. 
os的功能:對進程和進程運行環境進行管理,os 模塊還負責處理大部分的文件系統操作, 應用程序。
os.path的功能:可以完成一些針對路徑名的操作. 它提供的函數可以完成管理和操作文件路徑名中的各個部分, 獲取文件或子目錄信息, 文件路徑查詢等操作.對
a)os對目錄的操作:
mkdir(path[,mode=0777])----創建目錄
makedirs(name, mode=511)-----創建多層目錄, 
rmdir(path)------刪除目錄
removedirs(path)----刪除多層目錄
listdir(path)----列出指定目錄的文件
getcwd() --- ---返回當前工作目錄
chdir(path)-----改變當前工作目錄
walk(top,topdown=True, onerror=None)---生成一個目錄樹下的所有文件名
chroot()----改變當前進程的根目錄
 
示例:
****** ****mkdir()****************
>>> import os
>>> os.mkdir("/home/jane/qi",775)   
>>> os.mkdir("/home/jane/qi2",0777)  #這裏的mode=0777(默認mode),一開始沒有太明白,後來突然想起,應該是umask的原因,linux中目錄的默認umask是002,因此這裏要是創建的具
 
有缺省權限的目錄(775),所以mode-=0777 不缺定理解是否正確!
結果爲:
dr-----r-t. 2 jane jane 4096  8月 16 02:55 qi
drwxrwxr-x. 2 jane jane 4096  8月 16 02:56 qi2
*****makedirs()****************
>>> os.makedirs("/home/jane/qi3/aa",511)    
[jane@redhat aa]$ pwd
/home/jane/qi3/aa
[jane@redhat aa]$ ll -d
drwxrwxr-x. 2 jane jane 4096  8月 16 03:15 .   # 可以看出被創建的目錄也是具有775的權限的
[jane@redhat aa]$
help(makedirs)的幫助文檔,顯示是511這個我不是很明白?
makedirs(name, mode=511)
    makedirs(path [, mode=0777])
********* 其他**********
>>> os.rmdir("/home/jane/qi")
>>> os.removedirs("/home/jane/qi3/aa")
>>> os.listdir("/home/jane/qimeizhen")
['.test4.py.swp', '4.py', '.11.py.swp', 'test1.py', 'q.py', '1.py', '6.py', 'raw.py', '7.py', '5.py', 'for.py', '9.py', 'test2.py', 'test3.py', '3.py', '10.py', '2.py', 
 
'8.py']
>>> os.getcwd()
'/home/jane'
>>> os.chdir("/home/jane/qimeizhen")
>>> os.getcwd()
'/home/jane/qimeizhen'
   
b)os對文件的操作
remove()/unlink() --- 刪除文件
rename()/renames()---重命名文件
**********rename()and remove***************
>>> p=file("/home/jane/aa","w")
>>> p.write("hello world")
>>> p.close()
>>> os.rename("/home/jane/aa","/home/jane/ab")
 
c)os訪問/權限
access()----------檢驗權限模式
chmod()-----------改變權限模式
chown()/lchown()-----改變 owner 和 group ID/功能相同, 但不會跟蹤鏈接
umask()-------設置默認權限模式
 
d)os文件描述符操作
open()---底層的操作系統 open (對於文件, 使用標準的內建 open() 函數)
read()/write()---根據文件描述符讀取/寫入數據
dup()/dup2()----複製文件描述符號/功能相同, 但是是複製到另一個文件描述符設備號
makedev()-----從 major 和 minor 設備號創建一個原始設備號
 
 
e) 目錄的遍歷
方法有三種:
    遞歸函數
    Os.path.walk() 函數
    Os.walk() 函數
 
**************************遞歸函數遍歷**************************************
#!/usr/bin/python
#encoding=utf-8
#遞歸遍歷目錄(傳統方法)
import os
def VisitDir(path):
    li=os.listdir(path)
    for p in li:
        pathname=os.path.join(path,p)
        if not os.path.isfile(pathname):
            VisitDir(pathname)
        else:
            print pathname
 
if __name__=="__main__":
    path="/home/jane/qimeizhen"
    VisitDir(path)
~                                                                                 
**************************os.path.walk()函數**************************************
格式: walk(top, func, arg)
? 說明:
? top: 要遍歷的目錄樹
? Func: 表示回調函數
? arg: 參數元組
------------------
#!/usr/bin/python
#encoding=utf-8
#使用os.path.walk遍歷
import os, os.path
def visitDir(arg, dirname, names):
        for filepath in names:
                print os.path.join(dirname,filepath)
 
 
if __name__ == "__main__":
        path = r"/home/jane/qimeizhen"
        os.path.walk(path, visitDir, ())
*******************************Os.walk() 函數******************************************************
格式: os.walk(top, topdown= True, onerror=None)
 top: 需要遍歷的目錄樹路徑
 topdown: =True 表示首先返回目錄中的文件,然後在遍歷子目錄; =False 時,首先遍歷目錄的子目錄,然後遍歷目錄文件,最後返回根目錄文件
 Onerror=None: 是默認值,忽略遍歷中出現的錯誤,否則更具自定義函數輸出異常
 
#!/usr/bin/python
#encoding=utf-8
#使用os.walk遍歷
import os
def VisitDir(path):
        for root,dirs,files in os.walk(path):
                for filespath in files:
                        print os.path.join(root,filespath)
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章