IO編程
文件讀寫
Python中文件讀寫語法和C兼容
- 讀文件
使用Python內置的open()
函數(shù)滓技,傳入文件名和標示符:
f = open('/Users/michael/test.txt', 'r') # 'r' 表示讀,文件不存在會拋出IOError
print f.read() # 讀出文件中的全部內容
f.close() # 關閉文件屿储,文件打開后必須關閉
由于使用try來捕獲不可預料的IOError并在finally中關閉文件比較繁瑣姓蜂,使用with
來簡化:
with open("file_test.py", 'r') as f:
print f.read() # 一次讀取全部文件挥唠,適用于小文件
print f.read(10) # 一次讀取10字節(jié)
print f.readline() # 一次讀取一行,讀配置文件方便
print f.readlines() # 一次讀取全部行并返回按行排列(末尾有'\n')的list
file-like Object
有read()
方法的對象二進制文件
用'rb'
模式打開字符編碼
可以先用'rb'
模式打開后再用特定編碼解碼:
with open("file_test.py", 'rb') as f: # 二進制模式打開文件
print f.read(10)
print f.readline().decode('gbk') # 用GBK編碼解碼
或者直接用某種編碼打開:
import codecs
with codecs.open("file_test.py", 'r', 'gbk'):
print f.readline()
- 寫文件
打開文件時使用'w'
纲菌、'wb'
方式挠日,使用write()
來寫入文件,但文件不一定會立馬寫入磁盤翰舌,只有當flush()
或close()
調用的時候才會確定寫入 - 打開模式
r 以讀方式打開
w 以寫方式打開嚣潜,打開時會清空文件
a 以追加模式打開 (從 EOF 開始, 必要時創(chuàng)建新文件)
+ 以讀寫模式打開
b 以二進制模式打開
t 以文本方式打開
模式可組合使用
操作文件和目錄
- 系統(tǒng)信息及環(huán)境變量
import os
print os.name
# print os.uname() # win下沒有這個函數(shù)
print os.environ # 打印環(huán)境變量
print os.getenv('path') # 獲取某個環(huán)境變量的值
- 操作文件和目錄
import os
import shutil
print os.name
# print os.uname() # win下沒有這個函數(shù)
print os.environ # 打印環(huán)境變量
print os.getenv('path') # 獲取某個環(huán)境變量的值
abspath = os.path.abspath('.') # 查看當前目錄的絕對路徑,abspath()尋找當前路徑下的文件的絕對路徑
print abspath
join = os.path.join('.', 'testdir') # 把兩個路徑合成一個, 可以正確處理不同操作系統(tǒng)的路徑分隔符
print join
os.mkdir(join) # 創(chuàng)建目錄
os.rmdir(join) # 刪除目錄
print os.path.split(join) # 把一個路徑拆分為兩部分椅贱,后一部分總是最后級別的目錄或文件名
os.rename('file_test.txt', 'filetest.txt') # 對文件重命名
os.remove('filetest.txt') # 刪掉文件
shutil.copyfile('file_test.txt', 'filetest.txt') # 復制文件
print [x for x in os.listdir('.') if os.path.isdir(x)] # 列出當前目錄下的所有目錄
print [x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1] == '.py'] # 列出所有的.py文件
Python的os
模塊封裝了操作系統(tǒng)的目錄和文件操作懂算,要注意這些函數(shù)有的在os
模塊中,有的在os.path
模塊中
序列化
我們把變量從內存中變成可存儲或傳輸?shù)倪^程稱之為序列化庇麦,在Python中叫pickling计技,在其他語言中也被稱之為serialization,marshalling山橄,flattening等等
# coding=utf-8
try:
import cPickle as pickle
except ImportError:
import pickle
d = dict(name='Bob', age=20, score=88)
print pickle.dumps(d) # 序列化為字符串
f = open('dump.txt', 'ab+')
pickle.dump(d, f) # 序列化并保存到文件
f.close()
f = open('dump.txt')
d = pickle.load(f) # 從file-like Object對象反序列化
f.close()
print d
- Json
# coding=utf-8
import json
d = dict(name='Bob', age=20, score=88)
json_str = json.dumps(d)
print json_str
json_object = json.loads(json_str)
print json_object
print json_object['name']
class Student(object):
# __slots__ = ('name', 'age', 'score') # 沒有定義__slots__時對象內部默認使用dict來保存屬性
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
def student2dict(student):
return {
'name': student.name,
'age': student.age,
'score': student.score
}
def dict2student(d):
return Student(d['name'], d['age'], d['score'])
s = Student('Bob', 20, 88)
# print json.dumps(s, default=student2dict) # 使用序列化函數(shù)
json_str = json.dumps(s, default=lambda obj: obj.__dict__) # 沒有定義__slots__時對象內部默認使用dict來保存屬性垮媒,有__slots__的類無法使用這個特性
print json_str
json_object = json.loads(json_str, object_hook=dict2student)
print json_object