文件操作的學習筆記。
>>> file = open('/tmp/test.txt','r')
>>> file.read()
'root:x:0:0:root:/root:/bin/bash\nbin:x:1:1:bin:/bin:/sbin/nologin\ndaemon:x:2:2:daemon:/sbin:/sbin/nologin\nadm:x:3:4:adm:/var/adm:/sbin/nologin\nlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin\nsync:x:5:0:sync:/sbin:/bin/sync\nmysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash\n'
>>> file.close() #文件使用完以後要關閉文件,因爲文件會佔用資源
>>> with open('/tmp/test.txt','r') as f:
... print(f.read())
... #with語句自動調用了close方法
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
read() 一次性讀取所有內容,文件過大,內存容易出問題
read(size) size指定每次最多讀取的字節數,更安全
readline() 每次讀取一行
如果文件很小,read()一次性讀取最方便;如果不能確定文件大小,反覆調用read(size)比較保險;如果是配置文件,調用readlines()最方便:
#f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore', newline='')
open可以傳入一些參數:
encoding:指定編碼
errors:處理錯誤的方式,最簡單的是ignore忽略,但是這樣用多了不太好。
newline='':Python可以識別所有的普通換行符並將其轉換爲單個 \n 字符。 類似的,在輸出時會將換行符 \n 轉換爲系統默認的換行符。 如果你不希望這種默認的處理方式,可以給 open() 函數傳入參數 newline=''
>>> with open('/tmp/hello.txt','w') as f:
... f.write('hello') #文件寫入
... print('你好',file=f) #print輸入重定向到文件中
...
>>> file.read()
'hello你好\n'
#-- 文件基本操作
output = open(r'C:\spam', 'w') # 打開輸出文件,用於寫
input = open('data', 'r') # 打開輸入文件,用於讀。打開的方式可以爲'w', 'r', 'a', 'wb', 'rb', 'ab'等
fp.read([size]) # size爲讀取的長度,以byte爲單位
fp.readline([size]) # 讀一行,如果定義了size,有可能返回的只是一行的一部分
fp.readlines([size]) # 把文件每一行作爲一個list的一個成員,並返回這個list。其實它的內部是通過循環調用readline()來實現的。如果提供size參數,size是表示讀取內容的總長。
fp.readable() # 是否可讀
fp.write(str) # 把str寫到文件中,write()並不會在str後加上一個換行符
fp.writelines(seq) # 把seq的內容全部寫到文件中(多行一次性寫入)
fp.writeable() # 是否可寫
fp.close() # 關閉文件。
fp.flush() # 把緩衝區的內容寫入硬盤
fp.fileno() # 返回一個長整型的”文件標籤“
fp.isatty() # 文件是否是一個終端設備文件(unix系統中的)
fp.tell() # 返回文件操作標記的當前位置,以文件的開頭爲原點
fp.next() # 返回下一行,並將文件操作標記位移到下一行。把一個file用於for … in file這樣的語句時,就是調用next()函數來實現遍歷的。
fp.seek(offset[,whence]) # 將文件打操作標記移到offset的位置。whence可以爲0表示從頭開始計算,1表示以當前位置爲原點計算。2表示以文件末尾爲原點進行計算。
fp.seekable() # 是否可以seek
fp.truncate([size]) # 把文件裁成規定的大小,默認的是裁到當前文件操作標記的位置。
for line in open('data'):
print(line) # 使用for語句,比較適用於打開比較大的文件
open('f.txt', encoding = 'latin-1') # Python3.x Unicode文本文件