文件
什么是文件
- 文件是數(shù)據(jù)存儲的單位
- 文件通常用來長期存儲數(shù)據(jù)
- 文件中的數(shù)據(jù)是以字節(jié)為單位進行順序存儲的
文件的操作流程
- 打開文件
- 讀寫文件
- 關(guān)閉文件
任何的操作系統(tǒng),一個應(yīng)用程序同時打開文件的數(shù)量有最大數(shù)限制
文本文件操作
文件操作方法
-
open(file, mode='rt')
用于打開一個文件,返回此文件對應(yīng)的文件流對象,如果打開失敗,則會觸發(fā)OSError
錯誤-
file
要打開文件的路徑 -
mode
文件打開模式
-
-
file.close()
關(guān)閉文件,釋放系統(tǒng)資源 -
file.readline()
讀取一行數(shù)據(jù), 如果到達文件尾則返回空行 -
file.readlines(max_chars=-1)
返回每行字符串的列表,max_chars
為最大字符(或字節(jié))數(shù) -
file.read(size = -1)
從一個文件流中最多讀取size
個字符 -
file.writelines(lines)
每行字符串的列表,參數(shù)是由字符串組成的序列 -
file.write(text)
寫一個字符串到文件流中躲株,返回寫入的字符數(shù)脓斩,接收字符串參數(shù)凄鼻,適用于一次性將全部內(nèi)容寫入文件 -
file.flush()
把寫入文件對象的緩存內(nèi)容寫入到磁盤
總結(jié)
-
write()
接收字符串參數(shù)传睹,適用于一次性將全部內(nèi)容寫入文件;而writelines()
接收參數(shù)是由字符串組成的序列桐臊,適用于將列表內(nèi)容逐行寫入文件 -
readline()
比較不優(yōu)雅;read()
適合讀取內(nèi)容較少的情況,或者是需要一次性處理全部內(nèi)容的情況;而readlines()
用的較多婆廊,比較靈活饼疙,因為for循環(huán)是一種迭代器溺森,每次加載部分內(nèi)容,既減少內(nèi)存壓力窑眯,又方便逐行對數(shù)據(jù)處理
try:
f = open('./info.txt')
print('文件打開成功')
f.close()
print('文件已關(guān)閉屏积!')
except OSError:
print('文件打開失敗!')
文件打開模式
-
r
以只讀模式打開(缺省模式,必須保證文件存在) -
w
以只寫模式打開磅甩。若文件存在,則刪除原有文件內(nèi)容;若不存在,則新建 -
a
以追加模式打開炊林。若文件存在,則會追加到文件的末尾;若文件不存在,則新建 -
x
創(chuàng)建一個新文件, 并以寫模式打開這個文件,如果文件存在則會產(chǎn)生FileExistsError
錯誤 -
b
用二進制模式打開 -
t
文本文件模式打開 (默認)
常見模式組合
-
r'或'rt
默認模式,文本讀模式 -
w'或'wt
以文本寫模式打開(打開前文件被清空) -
rb
以二進制讀模式打開 -
ab
以二進制追加模式打開 -
wb
以二進制寫模式打開(打開前文件被清空) -
r+
以文本讀寫模式打開卷要,默認寫的指針開始指在文件開頭, 因此會覆寫文件 -
w+
以文本讀寫模式打開(打開前文件被清空) -
a+
以文本讀寫模式打開(只能寫在文件末尾) -
rb+
以二進制讀寫模式打開 -
wb+
以二進制讀寫模式打開(打開前被清空) -
ab+
以二進制讀寫模式打開 -
w+b
可以實現(xiàn)二進制隨機讀寫渣聚,當打開文件時,文件內(nèi)容將被清零 -
r+b
以二進制讀和更新模式打開文件,打開文件時不會清空文件內(nèi)容
文本文件的操作
默認文件中存儲的都為字符數(shù)據(jù),以行為單位進行分隔,在python內(nèi)部統(tǒng)一用\n
作為換行進行分隔,對文本文件讀寫需要用字符串(str
)進行數(shù)據(jù)讀取和寫入
各種操作系統(tǒng)的換行符
- Linux換行符 :
\n
- Window換行符 :
\r\n
- 舊的Macintosh換行符:
\r
- 新的Mac Os 換行符 :
\n
文本文件的迭代讀取
open()
函數(shù)返回來的文件流對象是可迭代對象
f = open('abc.txt')
# 每次取出一行,相當于line = f.readline()
for line in f:
print(line)
f.close()
標準輸入輸出文件
模塊名: sys
-
sys.stdin
(默認為標準鍵盤輸入設(shè)備)
ctrl + d 輸入文件末尾標識 -
sys.stdout
(默認為屏幕終端) -
sys.stderr
(默認為屏幕終端)
二進制文件操作
對于二進制文件的讀寫通常需要用字節(jié)串(bytes
)進行操作
-
F.tell()
返回當前文件流的絕對位置 -
F.seek(offset, whence=0)
改變數(shù)據(jù)流的位置,返回新的絕對位置-
offset
偏移量
大于0
代表向文件末尾方向移動
小于0
代表向文件頭方向移動 -
whenc
相對位置
0
代表人文件頭開始
1
代表從當前讀寫位置開始偏移
2
代表從文件尾開始偏移
-
-
F.readable()
判斷這個文件是否可讀,可讀返回True
,否則返回False
-
F.writable()
判斷這個文件是否可寫,可寫返回True
,否則返回False
-
F.seekable()
返回這個文件對象是否支持隨機定位 -
F.truncate(pos = None)
剪掉自pos
位置之后的數(shù)據(jù),返回新的文件長度(字節(jié)為單位)
漢字編碼
# 十個漢字占多少個字節(jié)
# GBK占20個字節(jié) , UTF-8 占 30個字節(jié)
國標系列
-
GB18030
二字節(jié)或四字節(jié)編碼 -
GBK
二字節(jié)編碼 -
GB2312
二字節(jié)編碼
(Windows 常用)
國際標準
-
UNICODE(2/4字節(jié)) <---> UTF-8 (1~6字節(jié))
(Linux / Mac OS X / IOS / Android 常用)
python 編碼(encode) 字符串
gb2312
gbk
gb18030
utf-8
ascii
編碼注釋
在源文件的第一行或第二行寫入如下內(nèi)容為編碼注釋
# -*- coding:gbk -*-
# 設(shè)置源文件編碼為:gbk
with
語句
with 表達式1 [as 變量1], 表達式2 [as 變量2]:
語句塊
- 使用于對資源進行訪問的場合,確保使用過程中不管是否發(fā)生異常,都會執(zhí)行必須的'清理'操作,并釋放資源
- 能夠用于
with
語句進行管理的對象必須是環(huán)境管理器
環(huán)境管理器
- 類內(nèi)有
__enter__
和__exit__
實例方法的類被稱為環(huán)境管理器 - 夠用
with
語句管理的對象必須是環(huán)境管理器 -
__enter__
方法將在進入with語句時被調(diào)用,并返回由as
變量管理的對象 -
__exit__
將在離開with
語句時被調(diào)用,且可以用參數(shù)來判斷在離開with
語句時是否有異常發(fā)生并做出相應(yīng)的處理
class A:
def __enter__(self):
print("已進入with語句")
return self # 返回的對象將由 as綁定
def __exit__(self, exc_type, exc_val, exc_tb):
# exc_type 在沒有異常時為None, 在出現(xiàn)異常時為異常類型
# exc_val 在沒有異常時為None, 在出現(xiàn)異常綁定錯誤對象
# exc_tb 在沒有異常時為None, 在出現(xiàn)異常時綁定traceback對象
print("已離開with語句")
對象的屬性管理函數(shù)
-
getattr(obj, name[, default])
從一個對象得到對象的屬性;getattr(x, 'y')
等同于x.y
; 當屬性不存在時,如果給出default
參數(shù),則返回default
,如果沒有給出default
,則產(chǎn)生一個AttributeError
錯誤 -
hasattr(obj, name)
用給定的name
返回對象obj
是否有此屬性,此種做法可以避免在getattr(obj, name)
時引發(fā)錯誤 -
setattr(obj, name, value)
給對象obj
的名為name
的屬性設(shè)置相應(yīng)的值value
,set(x, 'y', v)
等同于x.y = v
-
delattr(obj, name)
刪除對象obj
中的name
屬性,delattr(x, 'y')
等同于del x.y
class Dog:
pass
dog1 = Dog()
print(getattr(dog1,'color',None)) # None
dog1.color = 'white'
print(getattr(dog1,'color',None)) # white
print(hasattr(dog1,'kinds')) # False
print(hasattr(dog1,'color')) # True
setattr(dog1,'age',1)
print(getattr(dog1,'age',None)) # 1
delattr(dog1,'color')
print(getattr(dog1,'color',None)) # None
運算符重載
- 讓自定義的類生成的對象(實例)能夠使用運算符進行操作
- 讓自定義的類的實例像內(nèi)建對象一樣運行運算符操作
- 讓程序簡潔易讀
- 對自定義的對象,將運算符賦予新的運算規(guī)則
- 運算符重載不能改變運算符的優(yōu)先級
算術(shù)運算符的重載
-
__add__(self, rhs)
self + rhs
加法 -
__sub__(self, rhs)
self - rhs
減法 -
__mul__(self, rhs)
self * rhs
乘法 -
__truediv__(self, rhs)
self / rhs
除法 -
__floordiv__(self, rhs)
self // rhs
地板除法 -
__mod__(self, rhs)
self % rhs
求余 -
__pow__(self, rhs)
self ** rhs
冪
反向算術(shù)運算符的重載
當左手邊的類型為內(nèi)建類型,右手邊為自定義類型時,要實現(xiàn)運算必須用以下方法重載
-
__radd__(self, lhs)
lhs + self
加法 -
__rsub__(self, lhs)
lhs - self
減法 -
__rmul__(self, lhs)
lhs * self
乘法 -
__rtruediv__(self, lhs)
lhs / self
除法 -
__rfloordiv__(self, lhs)
lhs // self
地板除法 -
__rmod__(self, lhs)
lhs % self
求余 -
__rpow__(self, lhs)
lhs ** self
冪
復(fù)合賦值算術(shù)運算符的重載
-
__iadd__(self, rhs)
self += rhs
加法 -
__isub__(self, rhs)
self -= rhs
減法 -
__imul__(self, rhs)
self *= rhs
乘法 -
__itruediv__(self, rhs)
self /= rhs
除法 -
__ifloordiv__(self, rhs)
self //= rhs
地板除法 -
__imod__(self, rhs)
self %= rhs
求余 -
__ipow__(self, rhs)
self **= rhs
冪
class MyNumber:
def __init__(self,v):
self.data = v
def __repr__(self):
return 'MyNumber(%d)' % self.data
def __add__(self,other):
v = self.data + other.data
return MyNumber(v)
def __sub__(self,other):
v = self.data - other.data
return MyNumber(v)
n1 = MyNumber(100)
n2 = MyNumber(200)
n3 = n1 + n2 # 相當于 n3 = n1.__add__(n2)
print(n3)
n4 = n3 - n2 # 相當于 n4 = n3.__sub__(n2)
print(n4)
# ************************************************************
class MyList:
def __init__(self,iterator):
self.data = list(iterator)
def __repr__(self):
return 'MyList(%r)' % self.data
def __add__(self, other):
return MyList(self.data + other.data)
def __mul__(self, other):
return MyList(self.data * other)
def __rmul__(self, other):
return MyList(self.data * other)
def __iadd__(self, other):
self.data.extend(other.data)
return self
l1 = MyList([1,2,3])
l2 = MyList([4,5,6])
l3 = l1 + l2
print(l3)
l4 = l2 + l1
print(l4)
l5 = l1 * 2
print(l5)
l6 = 2 * l2
print(l6)
l7 = MyList([7,8,9])
l7 += l1
print(l7)
比較運算符的重載
比較運算符通常返回 True
或 False
-
__lt__(self, rhs)
self < rhs
小于 -
__le__(self, rhs)
self <= rhs
小于等于 -
__gt__(self, rhs)
self > rhs
大于 -
__ge__(self, rhs)
self >= rhs
大于等于 -
__eq__(self, rhs)
self == rhs
等于 -
__ne__(self, rhs)
self != rhs
不等于
位運算符重載
-
__invert__(self)
~ self
取反(一元運算符) -
__and__(self, rhs)
self & rhs
位與 -
__or__(self, rhs)
self | rhs
位或 -
__xor__(self, rhs)
self ^ rhs
位異或 -
__lshift__(self, rhs)
self << rhs
左移 -
__rshift__(self, rhs)
self >> rhs
右移
反向位運算符重載
-
__rand__(self, lhs)
lhs & self
位與 -
__ror__(self, lhs)
lhs | self
位或 -
__rxor__(self, lhs)
lhs ^ self
位異或 -
__rlshift__(self, lhs)
lhs << self
左移 -
__rrshift__(self, lhs)
lhs >> self
右移
復(fù)合賦值位運算符重載
-
__iand__(self, rhs)
self &= rhs
位與 -
__ior__(self, rhs)
self |= rhs
位或 -
__ixor__(self, rhs)
self ^= rhs
位異或 -
__ilshift__(self, rhs)
self <<= rhs
左移 -
__irshift__(self, rhs)
self >>= rhs
右移
一元運算符的重載
-
__neg__(self)
- self
負號 -
__pos__(self)
+ self
正號 -
__invert__(self)
~ self
取反
in / not in
運算符的重載
def __contains__(self, e) # e in self 成員運算
pass
索引和切片運算符的重載
讓自定義的類型的對象能夠支持索引和切片操作
-
__getitem__(self, i)
x = self[i]
索引/切片取值 -
__setitem__(self, i, v)
self[i] = v
索引/切片賦值 -
__delitem__(self, i)
del self[i] del
語句刪除索引等
slice
構(gòu)造函數(shù)
- 用于創(chuàng)建一個
Slice
切片對象,此對象存儲一個切片的起始值,終止值和步長信息 -
slice(start, stop=None, step=None)
創(chuàng)建一個切片對象-
s.start
切片起始值,默認為None
-
s.stop
切片終止值,默認為None
-
s.step
切片步長,默認為None
-