https://www.cnblogs.com/evablogs/p/6725242.html
?
文件的打開讀寫關閉(文件使用完畢后必須關閉,因為文件對象會占用操作系統的資源)
1 2 3 4 5 6 7 8 9 | #寫文件 with? open (r 'D:\Test\1.txt' , 'w' ) as f:??????????? #with比<strong>try....finally</strong>更加簡潔,with自動調用close()方法;open(文件路徑,讀取方式),r:只讀,默認打開方式 ?????? f.write( 'Hello,world' )???????????????????? #write(str):寫入字符串;writelines():一次性寫入多行 #讀文件 with? open (r 'D:\Test\1.txt' , 'r' ) as f:??????????? #r:讀 ??????? print ?f.read()????????? #read([size]),size可選,指定讀取的文件大小,單位是字節,默認讀取全部,readline():讀取一行;readlines([size]),讀取返回一個列表,占內存空間 >>> Hello,world |
1 2 3 4 5 6 | >>>? try : ??????? f = open (r 'D:\Test' ,r) ??????? print ?f.read() ???? finally : ???????? if ?f: ???????????? f.close() |
文件打開方式:
+:同時讀寫,即可讀又可寫,邊寫邊讀、邊讀邊寫
方式 | 說明 | 注意 | 是否清空文件 | 是否覆蓋文件內容 | 文件不存在是否創建新文件 |
‘r’ | 只讀 | 文件不存在時報錯 | - | - | 否 |
'r+' | 讀寫 | 可讀可寫,文件不存在報錯,寫入時只覆蓋寫入文件的大小 | 否 | 是 | 否 |
'w' | 只寫 | 可寫方式打開,不可讀 | 是 | - | 是 |
'w+' | 讀寫 | 可讀可寫 | 是 | - | 是 |
'a' | 追加 | 文件已有的內容后追加內容,不可讀 | 否 | 否 | 是 |
'a+' | 追加以及讀 | 可讀可追加,寫入時,添加到文章末尾,并且指針位于添加后的末尾,所以再次讀取會亂碼,因為指針指向末尾,讀取時實際上是跳過實際要讀取的內容,去讀取磁盤緩存的上一個文件緩存的內容,所以是亂碼 | 否 | 否 | 是 |
'rb','wb','ab','rb','wb+','ab+':二進制方式打開 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | >>> with? open (r 'D:\Test\a.txt' , 'w' ) as f: ????????? f.write( 'Hello,world' ) >>>with? open (r 'D:\Test\a.txt' , 'r' ) as f: ???????? print ?f.read() >>> Hello,world???????????????????????????????????????? #w寫入 >>> with? open (r 'D:\Test\a.txt' , 'a' ) as f:?????????????? #追加,在后面添加內容 ???????? f.write( 'Hello,world' ) >>> with? open (r 'D:\Test\a.txt' , 'r' ) as f: ???????? print ?f.read() >>> Hello,worldHello,world >>> with? open (r 'D:\Test\a.txt' , 'w' ) as f:?????????????? #清空前面的內容重新寫入 ????????? f.write( 'Hello,world' ) >>> Hello,world |
有關文件可能讀取出亂碼的問題:
一:檢查下文件的指針的指向,在寫完之后,必須要seek(0),把文件指針重新指向文件開頭,然后再讀,否則就會從緩沖區讀取一大堆亂碼
二:文件寫入的操作先是在緩存中進行的,只有文件關閉才真正寫入,因為read()
似乎還是優先讀取內存緩沖區。
以上的兩個問題涉及到文件指針的移動seek()以及刷新緩存flush()
1 2 3 4 5 6 7 8 9 | >>> f = open (r 'D:\Test\a.txt' , 'w' ) >>> f.write( 'kkkkkkkk' )???????????????????? #此時文件的指針=8,8個字節 >>> f.flush()?????????????????????????????? #刷新緩存,緩存中的內容刷新變成:kkkkkkkk[EOF],內容為空時:[EOF] >>> f.read()??????????????????????????????? #此時的指針在文件尾[EOF]上,則輸出的是'' '' >>> f.seek( 0 )?????????????????????????????? #將指針指向文件頭,再進行文件內容的讀取,就不會產生亂碼 >>> f.read() 'kkkkkkkk' >>> f.close() |
?
?產生亂碼例子:
1 2 3 4 | >>> f = open (r 'D:\Test\a.txt' , 'w+' ) >>> f.write( 'uuuuuuuuuuuuuuuu' ) >>> f.read()????????????????????????????? #沒有刷新緩存且將指針指向文件頭,讀取的是緩存中的其他亂碼內容 '\x00\x06\x00\x00\x00@\x00\x00\x00sb\x00\x00\x00d\x00\x00Z\x00\x00d\x01\x00d\............................. |