python--文件操作


  博客地址:http://www.cnblogs.com/yudanqu/

 

一、讀文件

  要把大象裝冰箱,需要分幾步?對於讀寫文件也是這樣簡單的流程,打開文件、讀取文件和關閉文件。

  描述符:文件所有操作涉及到描述符,描述符就是一個光標,讀取數據可以從光標開始向后依次讀,等等。

1、打開文件

open(path, flag[, encoding][, errors])
  • path:要打開文件的路徑
  • flag:打開方式
    • r    以只讀的方式打開文件,文件的描述符放在文件的開頭
    • rb  以二進制格式打開一個文件用於只讀,文件的描述符放在文件的開頭
    • r+  打開一個文件用於讀寫,文件的描述符放在文件的開頭
    • w   打開一個文件只用於寫入,如果該文件已經存在會覆蓋,不存在則創建新文件
    • wb 打開一個文件只用於寫入二進制,如果該文件已經存在會覆蓋,不存在則創建新文件
    • w+ 打開一個文件用於讀寫,如果該文件已經存在會覆蓋,不存在則創建新文件
    • a    打開一個文件用於追加如果文件存在,文件描述符將會放到文件末尾
    • a+  
  • encoding:編碼方式(一般utf-8)
  • errors:錯誤處理(一般不處理)
1 # 小栗子
2 f = open(path, "r", encoding="utf-8", errors="ignore")
3 # ignore 忽略錯誤,一般不寫后兩個參數

2、讀文件內容

 1 # 讀取文件全部內容
 2 str1 = f.read() # 讀文件比較小的,大的內存放不下
 3 
 4 # 讀取指定字符數(按字符數)
 5 str2 = f.read(10) # 一個字母和一個漢字都稱為一個字符
 6 
 7 # 讀取整行,包括"\n"字符
 8 str3 = d.readline()
 9 
10 # 讀取指定字符數
11 str4 = f.readline(10)
12 
13 # 讀取所有行並返回列表
14 str5 = f.readlines()
15 
16 # 若給定的數字大於0,返回實際size字節的行數
17 str6 = f.readlines(25) # 例如25個字節,每行存10個,那么此時讀取兩行
18 
19 # 修改描述符的位置
20 f.seek(10) # 改到第幾個字符的位置

3、關閉文件

1 f.close()

4、小栗子

# 一個完整的過程

try:
    f1.open(path, "r", encoding="utf-8")
    print(f1.read())
finally:
    if f1:
        f1.close()

# try...except...else...finally是異常處理的內容,這個例子用到的部分表示,如果打開讀取文件部分出錯,只要文件存在那么就在最后把文件關閉,這是一個很好的習慣,就比如說在Linux操作系統中,限制打開的文件數不超過1024個如果超過了,文件就打不開了

  當然這樣寫文件有些繁雜,那么還有更方便的方法:

# 簡單方法:

with open(path, "r", encoding="utf-8") as f2:
    print(f2.read())

# with可以把文件關閉的部分實現,不論我們是否操作,是否有錯誤,都會在最后幫我們把文件關閉,也避免了我們忘記關文件的困擾

 

二、寫文件

 1 f = open(path,"w") # 首先以寫方式打開文件
 2 
 3 # 將信息寫入緩沖區,而並沒有直接寫入文件當中,也就是說我們在寫文件時看文件中,沒有信息隨時寫入
 4 f.write("glabscufn")
 5 
 6 # 刷新緩沖區(要想邊寫邊存入文件的話可以手動刷新緩沖區)
 7 f.flush() # 直接把內部緩沖區的數據立刻寫入文件,而不是被動的等待文件關閉自動刷新緩沖區寫入
 8 
 9 '''
10 緩沖區的刷新:
11 1、文件關閉自動刷新 
12 2、手動flush刷新 
13 3、緩沖區滿了也可以自動刷新 
14 4、再有就是遇到'\n'也會刷新
15 '''
16 
17 f.close()

 

三、編碼與解碼

1、編碼

1 with open(path, "wb") as f1:
2     str = "asdasdasdasd"
3     f1.write(str.encode('utf-8')) # 用utf-8編碼

2、 解碼

1 with open(path, "rb") as f2:
2     data = f2.read()
3     new_data = data.decode("utf-8")
4     print(type(data)) # class<byte>
5     print(type(new_data)) # class<str>
6 # 主要是在有中文的情況下,其他情況不同的碼可能也譯碼正確
7 # 如果是二進制的字符串,要記得編碼解碼

 

四、list,tuple,dict,set

 1 import pickle # 數據持久性模塊,就是把數據存到磁盤
 2 
 3 #
 4 mylist = [1,2,3,4,5,"sadd"]
 5 f = open(path, "wb")
 6 pickle.dump(mylist, f)
 7 f.close()
 8 
 9 #
10 f1 = open(path, "rb")
11 templist = pickle.load(f1)
12 print(templist)
13 f1.close()

 

 

  作者:漁單渠(yudanqu)

  博客地址:http://www.cnblogs.com/yudanqu/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM