文件操作使用的函數
open 打開
read 讀
write 寫
close 關
其他非常用的 seek 設置讀取指針 tell 讀取讀取指針位置
windows中
def encode(self, encoding=’utf-8′, errors=’strict’)
open 和它的參數
open(file,mode=’r’,buffering=-1,encoding=None,errors=None,newline=None,closed=True,opener=None)
再mode的’r+’模式中
先讀取 后寫入會從最后面的地方開始寫入
這是因為它的指針stat指在了最后的地方
設置seek 他會寫入覆蓋指針開始的地方,寫玩后指針會在寫完內容的后面的地方
‘w+’模式中
進入文件文件不論事先存在與否都會是一個空的文件,
‘a+’模式中
指針開始的地方就在最后,讀取不到東西,設置指針seek可以讀取到內容
寫入內容后都不能夠再讀取,因為a寫入的內容都是追加的,指針在最后面
‘x+’模式
進入的文件是空的,先寫入后面才可以讀取,
寫模式中它的它從seek指針所在位置開始寫入
總結:讀取文件從指針位置讀取,讀寫文件后在讀或者寫的最后的地方是指針的位置,’a’模式中進入時就在最后寫入時是往最后面追加
buffering 緩存模式對于 t文本和b字節有差別
默認 -1 都是默認內存容量
0 b關閉緩存,t無法使用
1 b就是1個字節, t使用到了換行符就緩存
>1 b設置緩沖區大小,t 沒明顯效果在達到默認的緩存大小時依然能緩存
測試:
設置seek,tell時也會導致緩存內容緩存
如果一個文件多個線程訪問時,也會造成內容緩存
在linux中
from pathlib import Path
p = Path()
type(p)
>>pathlib.PosixPath
p
>>posixPath(‘.’)
p.absolute()
>>PosixPath(‘/home/python/magedu/projects/cmdb’)
在Windows中
from pathlib import Path
p = Path()
type(p)
>>pathlib.WindowsPath
p
>>WindowsPath(‘.’)
p.absolute()
>>WindowsPath(‘C:/Users/Administrator’)
p = p.joinpath(‘a’,’b’)
p.absolute()
>>PosixPath(‘/home/python/magedu/projects/cmdb/a/b’)
p = p/’c’/’d’ 相當于 p /=’c’/’d’
p
>>PosixPath(‘a/b/c/d’)
p=Path() #當前目錄
p=Path(‘a’,’b’,’c/d’) #當前目錄下面的a/b/c/d目錄
p=Path(‘/etc’) #根下的etc目錄
不論Linux,windows ‘/’不需要轉義 ‘\’需要轉義
p.parent 目錄的一個屬性返回它的父目錄
list(p2.parents) p2目錄更高級的目錄的列表
[PosixPath(‘/etc’),PosixPath(‘/’)]
p = Path() 不同于字符串的專門的對象,它的方法字符串都不能使用
os模塊
os.listdir(‘o:/temp’) 返回目錄內容列表
os.stat(path,*,dir_fd=None,follow_symlinks=True) 顯示文件或目錄的標志信息
os.stat_result(st_mode=33206, st_ino=3096224743941554, st_dev=305849394, st_nlink=1, st_uid=0, st_gid=0, st_size=12, st_atime=1508808655, st_mtime=1509154651, st_ctime=1508808655)
os.chmod(path,mode,*,dir_fd=None,follow_symlinks=True)
os.chmod(‘test.txt’,0o777)
os.chown(path,uid,gid)
shutil模塊 復制 刪除 移動
copyfile(src,dst,*,follow_symlinks=True)
copyfileobj(fsrc,fdst[,length])
src和dst 必須是表示路徑的字符串 length指定buffer的大小,必須對src可讀dst可寫
fsrc,fdst 必須是open打開的文件類型
它們的原來的權限設置不會改變
copymode(src,dst,*,follow_symlinks=True) 僅僅復制權限
基本數據類型中列表和字典,bytearray都有.copy()方法
copy(src,dst,*,follow_symlinks=True) 底層調用了copyfile和copymode
copy2(src,dst,*,follow_symlinks=True) 底層調用了copyfile和copystat
copytree(src,dst,symlinks=False,ignore=None,copy_function=copy2,ignore_dangling_symlinks=False)
遞歸復制整個目錄,文件直接拷貝,軟連接默認直接引用,
ignore= func ,提供一個callable(src,names)->ignored_names.names是os.listdir(src)的結果,
# o:/temp下有a,b目錄
def ignore(src,name):
ig = filter(lambda x: x.startswith(‘a’),names) # 忽略a 類型的文件
return set(ig)
shutil.copytree(‘o:/temp’,’O:/tt/o’,ignore=ignore)
– 普通文件
d 目錄文件
b 塊設備文件
c 字符設備文件
l 符號鏈
p 管道特殊文件
rm刪除
shutil.rmtree(path,ignore_errors=False,onerror=None) 遞歸刪除,非原子操作,
move移動
move(src,dst,copy_function=copy2)
遞歸移動文件,目錄到目標,返回目標
底層使用的是os.rename方法
csv 文件,是一種文件類型
生成一個csv類型的文件需要 指定一個.csv的文件路徑
寫入一個有行分隔符和列分隔符的字符串
行分隔符\r\n 列分割符常為逗號
讀取一個csv文件,要引入csv模塊
reader(csvfile,dialect=’excel’,**fmtparams) #返回一個迭代器是DictReader的實例
import csv
p = Path(‘o:/tmp/mycsv/test.csv’)
with open(str(p)) as f:
reader = csv.reader(f)
print(next(reader))
print(next(reader))
row = [4,’tom’,22,’tom’]
rows = [
(5,’jerry’,24,’jerry’),
(6,’justin’,22,’just\t”in’)
]
writer(csvfile,dialect=’excel’,**fmtparams) #返回DictWriter的實例
with open(str(p),’a+’) as f:
writer = csv.writer(f)
writer.writerow(row)
writer.writerrows(rows)
4 tom 22 tom
5 jerry 24 jerry
6 justin 22 just ”
ini文件 作為配置文件,它很流行
使用configparser配置解析器 這個模塊來對它操作
from configparser import ConfigParser
#讀取一個.ini文件
cfg = ConfigParser()
cfg.read(‘mysql.ini’) #指明路徑
cfg有.sections方法 和.items([section])方法如果知道其中的section名稱可以獲取
section 的鍵值對 ,沒有參數可以返回一個迭代器
serialization 序列化
將內存中對象存儲下來,把它變成一個個字節
deserialization 反序列化
字節恢復成內存中對象
每一種高級語言都有自己的序列化的實現
from pathlib import Path
import pickle
寫入
pickle.dump(存儲對象,文件打開對象) #在文件中操作的
pickle.dumps() #在內存中操作
lst = ‘a b c’.split()
d = dict(zip(‘abc’,range(3))
with open(‘o:/bin’,’wb’) as f:
pickle.dump(lst,f)
pickle.dump(d,f)
with open(‘o:/bin’,’rb’) as f:
tmp = pickle.load(f)
print(tmp)
tmp = pickle.load(f)
print(tmp)
輸出結果
[‘a’,’b’,’c’]
{‘a’:0,’b’:1,’c’:2}
class AA()
def show()
…….
aa =AA()
with open(‘o:/bin’,’wb’) as f:
pickle.dump(aa,f) # 對象aa寫入文件
with open(‘o:/bin’,’rb’) as f:
tmp= pickle.load(f)
print(type(tmp)) =>輸出<class ‘test.AA’>
tmp.show() 可以調用類對象里面的方法
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/88169