python基礎(四)文件操做和集合

一.文件操做python

對文件的操做分三步:windows

        一、打開文件獲取文件的句柄,句柄就理解爲這個文件ruby

        二、經過文件句柄操做文件bash

        三、關閉文件。測試

1.文件基本操做:ui

  • f = open('file.txt','r') #以只讀方式打開一個文件,獲取文件句柄,若是是讀的話,r能夠不寫,默認就是隻讀,
  • 在python2中還有file方法能夠打開文件,python3中file方法已經沒有了,只有open        
  • frist_line = f.readline()#獲取文件的第一行內容,返回的是一個list
  • print(frist_line)#打印第一行
  • res = f.read()#獲取除了第一行剩下的全部文件內容,文件句柄發生了變化
  • print(res)
  • f.close()#關閉文件

2.文件打開模式:編碼

r:只讀,不加模式默認爲r
    w:只寫,[不可讀,不存在則建立,存在則刪除內容]
    a:追加,[不可讀,不存在則建立,存在則只追加內容] "+" 表示能夠同時讀寫某個文件 r+ :讀寫--可讀、可寫、可追加,若是打開的文件不存在的話,會報錯 w+ :寫讀--先建立文件,再寫(在原文件上的修改都是覆蓋操做) a+ :追加讀--默認打開句柄在末尾,讀取需先seek(0)指定位置,一寫句柄就到末尾了 #r和w,seek指定句柄能夠覆蓋修改,a+指定句柄也是追加 "U"表示在讀取時,能夠將 \r \n \r\n自動轉換成 \n (與 r 或 r+ 模式同使用) rU r+U # windows上換行符爲 \r\n "b"表示處理二進制文件 rb:二進制文件讀 wb:二進制文件寫 ab:追加二進制 # 文件存在硬盤上都是二進制,前邊說encoding='utf-8'是指把二進制轉換成utf-8編碼打開, # 而「b」是指,不用轉換編碼,我直接讀取二進制

3.文件操做:spa

f = open("1.txt", 'r', encoding="utf-8") # encoding="utf-8",utf-8編碼打開文件,windows下默認gbk打開 f.readline() # 讀一行,字符串 f.readable() # 判斷文件是否可讀
f.writable() # 判斷文件是否可寫
f.encoding() # 打印文件的編碼
f.read() # 讀取文件句柄到結束全部內容,大文件時不要用,由於會把文件內容都讀到內存中
f.readlines() # 讀取文件全部內容,返回一個list,元素是每行的數據,大文件時不要用 f.write("天安門") # 寫入內容,r和w模式,爲句柄處覆蓋寫入,a模式寫到最後
f.writelines(['zhangsan'],['李四']) #將一個列表寫入文件中 f.flush() # 強制刷新(默認緩衝區滿了存入磁盤) f.close() # 文件關閉 f.closed() # 判斷文件是否關閉 f.read(5) # 讀取5個字符 f.tell() # 查看文件句柄位置。按照字符計數 f.seek(0) # 移動文件句柄到第0個字符位置 f.encoding # 文件編碼 f.truncate() # 什麼不寫清空文件 f.truncate(10) # r模式截斷出前10個字符,其餘模式仍是清空

大文件時,讀取文件高效的操做方法:
用上面的read()和readlines()方法操做文件的話,會先把文件全部內容讀到內存中,這樣的話,內存數據一多,很是卡,高效的操做,就是讀一行操做一行,讀過的內容就從內存中釋放了

f = open('file.txt')
for line in f: # f 變成了迭代器
  print(line) # 判斷行的話,需本身加個計數器

4.文件內容修改 
前面說的文件修改,只是對原內容覆蓋,並不會插入內容,原內容日後移,由於這樣有可能就把其餘文件覆蓋了,文件發生損壞。so: 
文件修改兩個辦法: 
  1. 加載到內存,內存修改,覆蓋寫回 
  2. 另打開一個文件,修改完寫到新文件中.net

with open("test", 'r+', encoding='utf-8') as fr res = fr.read()
  new_res = res.replace('我','me')
  fr.write(new_res)
with open("test", 'r', encoding='utf-8') as f, \ open("test.tmp", 'w', encoding='utf-8') as f_new: for line in f: if "聚焦頭條" in line: line = line.replace("聚焦頭條","fgf") f_new.write(line) # os.path.exists("test.bak") 判斷文件是否存在 # os.remove("test.bak") 刪除文件 # os.rename(test.tmp, test) 重命名

5.文件關閉(with語句) 
爲了不打開文件後忘記關閉,能夠經過管理上下文,即:code

with open('log') as f: pass

如此方式,當with代碼塊執行完畢時,內部會自動關閉並釋放文件資源。 
Python 2.7 後,with又支持同時對多個文件的上下文進行管理

 

二.集合

集合也是一種數據類型,一個相似列表的東西,特色是一個無序的,不重複的數據組合,它的主要做用以下:

  • 去重,把一個列表變成集合,就自動去重了
  • 關係測試,測試兩組數據以前的交集、差集、並集等關係

一、經常使用操做

去重
    list_1 = [1,1,2,3,4,5,6,6,7,7,8,8,9,9,3] set_1 = set(list_1) >>> set_1 {1, 2, 3, 4, 5, 6, 7, 8, 9} # 集合用{}表示 交集 set_2 ={0,2,3,4} set_1.intersection(set_2)
  set_1&set_2 並集: set_1.union(set_2)
  set_1 | set_2 差集: set_1.difference(set_2)
  set_1 - set_2 # in set_1 but not in set_2 子集: set_1.issubset(set_2) #判斷set_1是否是set_2的子集 父集: set_1.issuperset(set_2) #判斷
set_1是否是set_2的父集
對稱差集:(並集去除交集,即並集和交集的差集) 輸出2個列表都沒有的值
  set_1.symmetric_difference(set_2) 即(set_1 | set_2) - (set_1 & set_2)
set_1 ^ set_2
判斷有沒有交集,無交集,返回True
  set_1.isdisjoint(set_2)

二、符號操做

& : 交集        intersection
    | :並集        union
    - :差集 difference s <= t :子集 issubset s >= t :父集 issuperset ^ :對稱差集 symmetric_difference

三、集合增刪改查

添加:
    set_1.add(99) 批量添加 set_1.update([1,2,3,4]) 刪除: set_1.remove('h') # 沒有則報錯 set_1.discard(99) # 在則刪除,不在就不操做。無返回信息 隨機刪: set_1.pop() 長度: len(set_1) 是否屬於判斷 s in set_1 # (判斷成員在不在都是這麼寫,字典中判斷key) 返回 set 「s」的一個淺複製 s.copy() 
相關文章
相關標籤/搜索