文件讀寫
- 讀文件
由于文件讀寫時(shí)都有可能產(chǎn)生IOError,一旦出錯(cuò),后面的f.close()就不會調(diào)用目木。所以溃列,為了保證無論是否出錯(cuò)都能正確地關(guān)閉文件劲厌,我們可以使用try ... finally來實(shí)現(xiàn):
try:
f = open('/path/to/file', 'r') #二進(jìn)制文件用'rb',特定字符編碼encoding='gbk',忽略錯(cuò)誤errors='ignore'
print(f.read())
finally:
if f:
f.close()
可以用以下方法簡寫
with open('/path/to/file', 'r') as f:
print(f.read())
調(diào)用read()會一次性讀取文件的全部內(nèi)容听隐,如果文件有10G补鼻,內(nèi)存就爆了,所以雅任,要保險(xiǎn)起見风范,可以反復(fù)調(diào)用read(size)方法,每次最多讀取size個(gè)字節(jié)的內(nèi)容沪么。另外乌企,調(diào)用readline()可以每次讀取一行內(nèi)容,調(diào)用readlines()一次讀取所有內(nèi)容并按行返回list成玫。因此加酵,要根據(jù)需要決定怎么調(diào)用拳喻。
- 寫文件
>>> f = open('/Users/michael/test.txt', 'w')
>>> f.write('Hello, world!')
>>> f.close()
簡寫
with open('/Users/michael/test.txt', 'w') as f:
f.write('Hello, world!')
操作文件或目錄
# 查看當(dāng)前目錄的絕對路徑:
>>> os.path.abspath('.')
'/Users/michael'
# 在某個(gè)目錄下創(chuàng)建一個(gè)新目錄,首先把新目錄的完整路徑表示出來: 猪腕,這是因?yàn)閣indows和linux路徑結(jié)構(gòu)不一樣
>>> os.path.join('/Users/michael', 'testdir')
'/Users/michael/testdir'
# 然后創(chuàng)建一個(gè)目錄:
>>> os.mkdir('/Users/michael/testdir')
# 刪掉一個(gè)目錄:
>>> os.rmdir('/Users/michael/testdir')
# 拆分路徑
>>> os.path.split('/Users/michael/testdir/file.txt')
('/Users/michael/testdir', 'file.txt')
# 獲得文件擴(kuò)展名
>>> os.path.splitext('/path/to/file.txt')
('/path/to/file', '.txt')
# 對文件重命名:
>>> os.rename('test.txt', 'test.py')
# 刪掉文件:
>>> os.remove('test.py')
#復(fù)制在shutil模塊的copyfile()函數(shù)
# 過濾文件
>>> [x for x in os.listdir('.') if os.path.isdir(x)]
['.lein', '.local', '.m2', '.npm', '.ssh', '.Trash', '.vim', 'Applications', 'Desktop', ...]
序列化
- Json
import json
class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
s = Student('Bob', 20, 88)
#序列
print(json.dumps(s, default=lambda obj: obj.__dict__))
- 反序列
如果我們要把JSON反序列化為一個(gè)Student對象實(shí)例冗澈,loads()方法首先轉(zhuǎn)換出一個(gè)dict對象,然后,我們傳入的object_hook函數(shù)負(fù)責(zé)把dict轉(zhuǎn)換為Student實(shí)例:
def dict2student(d):
return Student(d['name'], d['age'], d['score'])
>>> json_str = '{"age": 20, "score": 88, "name": "Bob"}'
>>> print(json.loads(json_str, object_hook=dict2student))
<__main__.Student object at 0x10cd3c190>