操作
r 以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。
rb 以二進制格式打開一個文件用於只讀。文件指針將會放在文件的開頭。這是默認模式。
r+ 打開一個文件用於讀寫。文件指針將會放在文件的開頭。
rb+ 以二進制格式打開一個文件用於讀寫。文件指針將會放在文件的開頭。
w 打開一個文件 只用於寫入 。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
wb 以二進制格式打開一個文件只用於寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
w+ 打開一個文件 用於讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
wb+ 以二進制格式打開一個文件用於讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
a 打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。
如果該文件不存在,創建新文件進行寫入。
ab 以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。
也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。
a+ 打開一個文件用於讀寫。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。
如果該文件不存在,創建新文件用於讀寫。
ab+ 以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。如果該文件不存在,創建新文件用於讀寫。
總結: 有+ :讀寫
無+ :要麼讀要麼寫
有b :二進制格式
文件
#寫入一個文件**
fo = open("foo.txt", "wb")
fo.write( "www.runoob.com!\nVery good site!\n");
#關閉打開的文件**
fo.close()
或者、
with open("foo.txt", "wb") as fo: #這個不需要close
fo.write( "www.runoob.com!\nVery good site!\n");
#讀取一個文件**
fo = open("foo.txt", "r+")
str = fo.read(10); #讀取10個字符
str = fo.readline(); #讀取一行
print "讀取的字符串是 : ", str
#查找當前位置**
position = fo.tell();
print "當前文件位置 : ", position
#把指針再次重新定位到文件開頭**
position = fo.seek(0, 0);
str = fo.read(10);
print "重新讀取字符串 : ", str
# 關閉打開的文件**
fo.close()
# 重命名文件test1.txt到test2.txt**
import os
os.rename( "test1.txt", "test2.txt" )
# 刪除一個已經存在的文件test2.txt**
os.remove("test2.txt")
# linecache使用:
print linecache.getline(”temp.txt“,4) 獲取第四行的內容
lines = linecahe.getlines(”temp.txt“)
print lines 得到一個list list的每個元素是每行內容
目錄
# 創建目錄test
os.mkdir("test")
# 將當前目錄改爲"/home/newdir"
os.chdir("/home/newdir")
# 給出當前的目錄
print os.getcwd()
# 刪除”/tmp/test”目錄
os.rmdir( "/tmp/test" )
文件夾操作
import os
os.path.isdir(參數) #判斷是否是文件夾
查看一個當前文件的權限
oct(os.stat('e.py').st_mode) #oct 轉成八進制 st_mode 十進制的權限
增加可執行權限
os.chmod('e.py',os.stat('e.py').st_mode | stat.S_IXUSR)
如何讀寫文本文件
文本文件編碼格式已知,在python2.x python3.x 中分別如何讀取該文件
解決方案:
字符串的語義發生了變化:
python 2 python3
str bytes
unicode str
python 2.x 寫入文件前對unicode編碼,讀入文件後對二進制字符串編碼
python 3.x open函數指定't'的文本模式,endcoding指定編碼格式
python 2.x
unicode 和 str 之間的轉換:
s=u'你好'
print s.encode('utf8') #將得到一個str的字符串
print s.encode('gbk')
s2 = s.encode('utf8')
print s2.decode('utf8') #解碼操作
f = open('py2.txt','w') #以只寫的方式打開
s= '你好'
f.write(s.encode('gbk'))
f.close()
f = open('py2.txt','r')
t = f.read()
print t.decode('gbk')
python 3.x
bytes 字符串的表示 b'efjwefwief'
unicode 字符串的表示 '你好' #和python 2.x 不同 python 2.x 需要加 u'你好' 表示unicode字符串
open ('py3.txt','wt') #以t文本模式進行寫操作
f = open('py3.txt','wt',endoding='utf8')
f.write('你好,測試')
f.close()
f = open('py3.txt','rt',endoding='utf8')
s = f.read()
print(s)
如何處理二進制文件
使用python 分析一個wav文件頭部的信息,處理音頻數據
f = open('demo.wav','rb') #以二進制的模式進行打開文件
合併一個文件夾下所有文件的內容
import os
#使用遞歸去解決
def merge(folder_path):##習題2
if not os.path.exists(folder_path):
return 'not exists'
for f in os.listdir(folder_path):
file_path = os.path.join(folder_path,f)
if os.path.isdir(file_path):
merge(file_path)
else:
merge_file = open('/tmp/merge_test','ab+')
content = open(file_path,'r').read()
merge_file.write(content)
merge_file.close()
merge('/tmp/5')
列出文件夾下面的所有文件
import os
rootdir = u'E:\python'
list = os.listdir(rootdir)
for i in range(0,len(list)):
path = os.path.join(rootdir,list[i])
if os.path.isfile(path) and path.find("~") == -1:
print path
文件緩衝區
設置文件的緩衝文件的緩衝通常分爲:全緩衝,行緩衝,無緩衝
在某些tty設備(比如終端設備)就是使用的行緩衝
串口設備就是無緩衝
如何設置python中文件對象的緩衝行爲?
解決方案:
全緩衝:open函數中的buffering設置爲大於1的整數n,n爲緩衝區大小;
行緩衝:open函數中的buffering設置爲1:
無緩衝:open函數中的buffering設置爲0
舉個栗子:
全緩衝:
a = open('demo.txt' , 'w' , buffering = 20)
a.write('=' * 20)
行緩衝:
a = open('demo.txt' , 'w' , buffering = 1)
a.write(' 1234\n ')
無緩衝:
a = open('demo.txt' , 'w' , buffering = 0)
a.write('abcde')