1. 打開文件
f = open(filename,mode)
mode | 功能 |
---|---|
'r' | 讀 |
“w' | 寫 |
'a' | 追加 |
'b' | 二進(jìn)制模式(添加到前三個(gè)模式中)除了純文本外都應(yīng)該用這個(gè)模式 |
'+' | 讀/寫模式(添加到前三個(gè)模式種) |
- 'r','r+'模式下摄悯,文件必須存在,否則報(bào)錯(cuò)愧捕。而'w' 'a' 模式下文件不存在會(huì)新建文件奢驯,若存在文件,'w'模式會(huì)把原來的文件清空次绘,'a'則追加在源文件末尾瘪阁。
- 對(duì)于小文件來說,可以直接用
f.read()
來讀取所有的字邮偎。 - 對(duì)于大文件來說管跺,可能一次性讀取很大文件的時(shí)候,內(nèi)存不夠钢猛,我們可以連續(xù)調(diào)用
f.read(size)
來指定讀取的字符數(shù)伙菜。例如:
part = f.read(5000) #一次讀取5000字節(jié)
while part:
print(part)
part = f.read(5000)
- 更好的方式:
with open(filename, 'rb') as f:
for line in f:
<do something with the line>
對(duì)可迭代對(duì)象 f,進(jìn)行迭代遍歷:for line in f命迈,會(huì)自動(dòng)地使用緩沖IO(buffered IO)以及內(nèi)存管理贩绕,而不必?fù)?dān)心任何大文件的問題火的。
- 對(duì)于文本文件,最好就是用readlines()方法來一行一行讀取淑倾。
with open(path,'r') as f:
for line in f.readlines():
print(line.strip()) # str.strip()用于去除結(jié)尾處的'\n'
- 由于文件通常要用
f.close()
來關(guān)閉馏鹤,有時(shí)候出現(xiàn)異常的時(shí)候.close()
就無法調(diào)用。所以一般采用with open(path,mode) as f:
表示try...finally的結(jié)構(gòu)娇哆。建議都采用with open() as f:
來打開文件 - 可以用
f.seek(0)
方法讓指針回到文件初始位置湃累。
2. 操作文件。
- 常常需要
import os,shutil
- 獲取當(dāng)前工作目錄: os.getcwd()
- 獲取指定目錄下的文件和目錄名字:
os.listdir()
不傳入?yún)?shù)則獲取工作目錄下的文件碍讨。 - 文件刪除:
os.remove(path)
——?jiǎng)h除path的文件治力,os.rmdir(path)
——?jiǎng)h除空文件夾。shutil.rmtree(path)
—— 刪除一個(gè)文件夾以及其所有的文件勃黍。注意這種方式會(huì)直接刪除文件不進(jìn)入回收站宵统。
安全刪除:用第三方的send2trash庫 ——send2trash.send2trash()
—— 把文件丟進(jìn)垃圾箱。 - 創(chuàng)建目錄:?jiǎn)蝹€(gè)目錄
os.mkdir('test')
; 多級(jí)目錄os.makedirs(r'python\test')
- 獲取文件大懈不瘛: os.path.getsize(filename)
- 文件復(fù)制:
shutil.copy(from,to)
—— 復(fù)制單個(gè)文件马澈,to可以是一個(gè)文件夾名字也可以是文件的新名字;
shutil.copytree(from,to)
———復(fù)制復(fù)制一個(gè)文件樹(非空文件夾全部復(fù)制過去)路徑都是文件夾的名字。 - 文件移動(dòng):
shutil.move(from,to)
'to'是一個(gè)文件夾或文件新名字弄息。 -
os.path.split()
可以分離最后一擊的目錄或文件痊班;os.path.splitext()
可以直接分離出來文件擴(kuò)展名,很方便摹量。
>> os.path.split('/Users/chen/testdir/file.txt')
('/Users/chen/testdir', 'file.txt')
>>> os.path.splitext('/path/to/file.txt')
('/path/to/file', '.txt')
3.序列化
- 序列化:把程序運(yùn)行過程中產(chǎn)生的變量變成可以儲(chǔ)存或傳輸?shù)膬?nèi)容涤伐;
反序列化,把數(shù)據(jù)序列化的內(nèi)容重新讀取到內(nèi)容中荆永。 -
pickle
為python特有的序列化模塊废亭,但是并不通用,用json
更好具钥。 - 建立字典:
d = dict (a='xxx',b='xxx',c='xxx')
JSON ——表示出來就是一個(gè)字符串豆村,很方便讀寫。
JSON類型 | Python類型 |
---|---|
{} | dict |
[] | list |
"string" | str |
123.456 | int or float |
true/false | True/False |
null | None |
- 內(nèi)置的
json
模塊可以實(shí)現(xiàn)python對(duì)象和JSON格式的互相轉(zhuǎn)換骂删。 -
json.dumps()
進(jìn)行序列化
d = dict(name = 'Jane', age=20,score=88)
>> {'age': 20, 'name': 'bob', 'score': 88}
json.dumps(d)
>> '{"name": "bob", "age": 20, "score": 88}'
-
json.loads(json_str)
反序列化
c = json.dumps(d)
json.loads(c)
>> {'age': 20, 'name': 'bob', 'score': 88}
然后再把 json.dumps(d) 通過文件讀寫的方式寫在本地或者傳輸?shù)絼e的地方去掌动。
- 參數(shù):
intdent
(縮進(jìn))——默認(rèn)為0,這樣打印出來的只有一行宁玫,不好看粗恢,一般寫indent=4
ensure_ascii
——默認(rèn)為True,若內(nèi)容包含非ASCII的字符(比如中文)欧瘪,會(huì)出現(xiàn)'\uXXXX'眷射,設(shè)置為ensure_ascii=False
就可以正常顯示了。 -
json.dump()
和json.dumps()
他們的區(qū)別在于前者輸出一個(gè)文件流,而后者輸出的是一個(gè)字符串妖碉。