python檔案讀寫小結
讀檔案
開啟乙個檔案用open()方法(open()返回乙個檔案物件,它是可迭代的):
>>> f = open('test.txt
', '
r')
r表示是文字檔案,rb是二進位制檔案。(這個mode引數預設值就是r)
如果檔案不存在,open()
函式就會丟擲乙個ioerror
的錯誤,並且給出錯誤碼和詳細的資訊告訴你檔案不存在:
>>> f=open('test.txt
', 'r'
)traceback (most recent call last):
file
"", line 1, in
filenotfounderror: [errno 2] no such file or directory: '
test.txt
'
檔案使用完畢後必須關閉,因為檔案物件會占用作業系統的資源,並且作業系統同一時間能開啟的檔案數量也是有限的
>>> f.close()
由於檔案讀寫時都有可能產生ioerror
,一旦出錯,後面的f.close()
就不會呼叫。所以,為了保證無論是否出錯都能正確地關閉檔案,我們可以使用try ... finally
來實現:
try:f = open('
/path/to/file
', 'r'
(f.read())
finally:if
f:f.close()
但是每次都這麼寫實在太繁瑣,所以,python引入了with
語句來自動幫我們呼叫close()
方法:
with open('/path/to/file
', 'r'
) as f:
print(f.read())
python檔案物件提供了三個「讀」方法: read()、readline() 和 readlines()。每種方法可以接受乙個變數以限制每次讀取的資料量。
注意:這三種方法是把每行末尾的'\n'也讀進來了,它並不會預設的把'\n'去掉,需要我們手動去掉。
in[2]: with open('test1.txt
', 'r'
) as f1:
list1 =f1.readlines()
in[3]: list1
out[3]: ['
111\n
', '
222\n
', '
333\n
', '
444\n
', '
555\n
', '
666\n
']
去掉'\n'
in[4]: with open('test1.txt
', 'r'
) as f1:
list1 =f1.readlines()
for i in
range(0, len(list1)):
list1[i] = list1[i].rstrip('\n'
)in[5]: list1
out[5]: ['
111', '
222', '
333', '
444', '
555', '
666']
對於read()和readline()也是把'\n'讀入了,但是print的時候可以正常顯示(因為print裡的'\n'被認為是換行的意思)
in[7]: with open('test1.txt
', 'r'
) as f1:
list1 =f1.read()
in[8]: list1
out[8]: '
111\n222\n333\n444\n555\n666\n
'in[9]: print
(list1)
111222
333444
555666
in[10]: with open('
test1.txt
', 'r'
) as f1:
list1 =f1.readline()
in[11]: list1
out[11]: '
111\n
'in[12]: print
(list1)
111
乙個python面試題的例子:
要點就是:(1)用with (2)處理行末的'\n' (3)使用二分查詢提高演算法效率。(4)使用set快速去重。
寫檔案和讀檔案是一樣的,唯一區別是呼叫open()
函式時,傳入識別符號'w'
或者'wb'
表示寫文字檔案或寫二進位制檔案:
>>> f = open('test.txt
', 'w'
) # 若是'wb'就表示寫二進位制檔案
>>> f.write('
hello, world!')
>>> f.close()
注意:'w'這個模式是醬紫:如果沒有這個檔案,就建立乙個;如果有,那麼就會先把原檔案的內容清空再寫入新的東西。所以若不想清空原來的內容而是直接在後面追加新的內容,就用'a'這個模式。
我們可以反覆呼叫write()
來寫入檔案,但是務必要呼叫f.close()
來關閉檔案。當我們寫檔案時,作業系統往往不會立刻把資料寫入磁碟,而是放到記憶體快取起來,空閒的時候再慢慢寫入。只有呼叫close()
方法時,作業系統才保證把沒有寫入的資料全部寫入磁碟。忘記呼叫close()
的後果是資料可能只寫了一部分到磁碟,剩下的丟失了。所以,還是用with
語句來得保險:
with open('test.txt
', 'w'
) as f:
f.write(
'hello, world!
')
python檔案物件提供了兩個「寫」方法: write()和 writelines()。
f1 = open('test1.txt
', 'w'
)f1.writelines(["1
", "
2", "3"
])#此時test1.txt的內容為:123
f1 = open('
test1.txt
', 'w'
)f1.writelines([
"1\n
", "
2\n", "
3\n"])#
此時test1.txt的內容為:#1
#2
#3
關於open()的mode引數:
'r':讀
'w':寫
'a':追加
'r+' == r+w(可讀可寫,檔案若不存在就報錯(ioerror))
'w+' == w+r(可讀可寫,檔案若不存在就建立)
'a+' ==a+r(可追加可寫,檔案若不存在就建立)
對應的,如果是二進位制檔案,就都加乙個b就好啦:
'rb' 'wb' 'ab' 'rb+' 'wb+' 'ab+'
file_obj.seek(offset,whence=0)
file_obj.seek(offset,whence=0)方法用來在檔案中移動檔案指標。offset表示偏移多少。可選引數whence表示從**開始偏移,預設是0為檔案開頭,1為當前位置,2為檔案尾部。舉例:
f = open("test1.txt
", "a+"
(f.read())
f.write('1
')f.seek(0, 0)
#把檔案指標從末尾移到開頭,沒有這句話下面的read()就讀不到正確的東西
(f.read())
f.close()
注意:這個檔案指標的改變只是作用於'r',對'w'和'a'不會起作用,如果是'w',那麼write()永遠都是從開頭寫(會覆蓋後面對應位置的內容),是'a'的話write()就永遠都是從最後開始追加。
>>> f = open('test.txt
', '
r', encoding='
gbk'
)>>>f.read()'測試
'
遇到有些編碼不規範的檔案,你可能會遇到unicodedecodeerror
,因為在文字檔案中可能夾雜了一些非法編碼的字元。遇到這種情況,open()
函式還接收乙個errors
引數,表示如果遇到編碼錯誤後如何處理。最簡單的方式是直接忽略:
>>> f = open('test.txt
', '
r', encoding='
gbk', errors='
ignore
')
python檔案讀寫小結
Python檔案讀寫
今天在看python檔案讀寫操作,發現python file name mode buffering file 函式用於建立乙個file物件,它有乙個別名叫open 可能更形象一些,它們是內建函式。來看看它的引數。它引數都是以字串的形式傳遞的。name是檔案的名字。mode 是開啟的模式,可選的值為...
python檔案讀寫
檔案讀寫模式 模式 描述 r以讀方式開啟檔案,可讀取檔案資訊。w以寫方式開啟檔案,可向檔案寫入資訊。如檔案存在,則清空該檔案,再寫入新內容 a以追加模式開啟檔案 即一開啟檔案,檔案指標自動移到檔案末尾 如果檔案不存在則建立 r 以讀寫方式開啟檔案,可對檔案進行讀和寫操作。w 消除檔案內容,然後以讀寫...
python 讀寫檔案
python讀寫檔案在文字不大的情況可以用正常的 open 然後讀入 readline行讀入 或者整體讀入 read readlines 基本知識 file open path,r 說明 第乙個引數是檔名稱,包括路徑 第二個引數是開啟的模式mode r 唯讀 預設。如果檔案不存在,則丟擲錯誤 w 只...