Python中打開文件命令 open(),open命令返回文件的一個句柄:如:
f = open('e:\\123.txt')
# read()對打開的文件進行讀的操作
print(f.read())
# 關閉文件,文件打開后一定要記得關閉文件。在寫的時候 可以:打開,關閉先寫完,再寫打開和關閉中間的代碼
f.close()
f = open('e:\\123.txt')
#這段代碼,open 沒有指定 mode= 參數,默認使用只讀的方式打開文件,文件沒有寫的權限
f = open('e:\\123.txt')
f.write('hello python')
f.close()
上面的代碼會報錯 io.UnsupportedOperation: not writable
另外,如果沒有使用為open指定 encoding= 參數,計算機默認使用系統的編碼方式打開文件。windows下默認為 gbk, linux下默認為utf-8
文件的打開方式格式: 文件句柄 = open('文件路徑',打開模式, 編碼方式)
文件打開方式:
1.r, 只讀的方式打開(文件必須存在,如果文件不存在,則會拋出異常) 注:文件以什么方式編碼方式寫的,就以什么編碼方式打開
f = open('e:\\123.txt',mode='r',encoding='utf-8')
print(f.read())
f.close()
2.w, 只寫模式 (文件不可讀,如果文件不存在,則創建一個新的文件,如果文件存在,則會清空里面的內容)
f = open('e:\\123.txt',mode='w',encoding='utf-8')
f.write('hello python!') # 在寫的時候,要指定編碼的方式
f.close()
3.a,只追加寫的模式 (文件不可讀,不存在則創建新的文件,文件存在的話,可在后面追加內容)
f = open('e:\\123.txt',mode='a',encoding='utf-8')
f.write('jack is a student')
f.close()
對於非文本的文件,使用b的模式。'b'表示以字節的方式進行操作 如:rb,wb,ab 分別對應以上內容,如果以b的方式打開,讀取到的內容是字節類型,寫入的時候也需要提供字節類型,不能指定編碼
f = open('e:\\123.txt',mode='rb') # 指定encoding= 參數 會報錯
print(f.read()) # b'\xd6\xd0\xb9\xfa
f.close()
以上代碼 輸出:b'\xd6\xd0\xb9\xfa' 如果在寫的模式下,寫的時候也要以字節的方式進行寫
'+'模式 ---- r+: 讀寫模式 w+:寫讀模式 a+:寫讀模式
f = open('e:\\123.txt',mode='r+',encoding='gbk')
print(f.read())
f.write('helo')
print(f.read()) # 此處在讀的時候,就讀不到 后面的 hello了,因為,在執行完 write(’hello') 這段代碼后,光標移動到了文件的末尾
f.close()
在 r+ 模式下,應該先讀,后寫,如果先寫,后讀,同樣的道理,光標移動到了文件末尾,將讀取不到內容
f = open('e:\\123.txt',mode='w+',encoding='gbk')
f.write('你好,hellopython') # 清空文件中的內容,然后重新寫數據
f.seek(0) # 將光標移動到文件開頭
print(f.read())
f.close()
f = open('e:\\123.txt',mode='a+',encoding='gbk') # 在 a+ 模式下,將在文件的末尾追加數據,不會覆蓋原來的內容
f.write('\njack is a student')
f.seek(0) # 將光標移動到文件開頭
print(f.read())
f.close()
文件讀取的其他操作
很多時候,在讀寫文件的時候,只是打開文件,open 而忘記關閉文件,close,可以使用簡單的方式來操作,使用with open。如:
l1 = ['靜夜思','李白','床前明月光','疑是地上霜','舉頭望明月','低頭思故鄉']
with open('e:\\靜夜思.txt',mode='w+',encoding='utf-8') as f:
for l1_data in l1:
f.write(l1_data + '\n') # f.writelines(l1) 可以將列表l1中的內容全部寫進去,但是不換行
f.seek(0) # 將光標放到文件首
print(f.readlines()) # 逐行讀取文件,並將文件按行為元素保存到一個列表中
f.seek(3)
index = f.tell() # 獲取當前光標的位置
print(index) # 打印 3
關於seek 和 tell 這兩個函數
with open('e:\\123.txt',mode='w+',encoding='utf-8') as f:
f.write('abcdefgh') # 一共 8 個字符,現在想要讀取ef兩個字符
f.seek(4) # 將光標移動到4的位置,也就是 d 的后面,從e開始讀取
index = f.tell() #獲取光標位置
print(f.read(2),index) # 讀取兩個字符,將讀到 ef
with open('e:\\123.txt',mode='w+',encoding='utf-8') as f:
f.write('中國一定強') # 在文件中寫入: 中國一定強 按照 utf-8的編碼方式寫入
f.seek(6) # 將光標移動到位置 6
index = f.tell() # 讀取光標的位置
print(f.read(2),index) # 讀取兩個字符
以上代碼 輸出 :一定 6
這里需要注意的是:移動光標 seek 以及 讀取光標位置 tell 這兩個函數,如果是英文字母。則一個字符為一個位置,如果是其他,按照編碼方式來指定或者獲取位置
中文 utf-8 的編碼方式,一個漢字占用 3 個字節,所以 '中國'占用6個位置 在移動光標,或者獲取光標位置的時候 要三個三個的移動
read 在讀取的時候,按照能用眼睛看到的最小單位來讀取