python數據結構之列表、字典、元組、集合
列表在python裏是有序集合對象類型。
列表裏的對象可以是任何對象:數字,字符串,列表或者字典,元組。與字符串不同,列表是可變對象,支持原處修改的操作
python的列表是:
- 任意對象的有序集合
- 通過偏移讀取
- 可變長度、異構以及任意嵌套
- 屬於可變序列的分組
- 對象引用數組
列表的操作
列表的操作和字符串大部分都相同:
合並/重復:
- list1+list2:結果是兩個列表按順序結合
- list*3:結果是列表list重復三次
- for i in list1: print(i):按順序打印列表裏的內容
- 3 in list:判斷列表裏有沒有一個對象是對象3
- list1.index(1):查找列表裏第一個為1的對象的位置
- list1.count(1):查找列表裏對象為1的個數
- list1[x:y]:取第x到y的對象,重新建立一個列表
- len(list1):list1裏的對象個數
基本列表操作
創建一個列表:
>>> list=[]
>>> list=[1,2,‘3‘,[]]
>>> list
[1, 2, ‘3‘, []]
列表取值:
>>> list[1]
2
>>> list[0:3]
[1, 2, ‘3‘]
重復列表內容:
>>> list*3 [1, 2, ‘3‘, [], 1, 2, ‘3‘, [], 1, 2, ‘3‘, []]
使用in方法來判斷對象是否在列表中:
>>> 3 in list
False
>>> [] in list
True
循環打印:
>>> for i in list:
... print (i,end=‘ ‘)
...
1 2 3 []
叠代方式創建列表:
>>> list=[i*4 for i in ‘ASDF‘ ]
>>> list
[‘AAAA‘, ‘SSSS‘, ‘DDDD‘, ‘FFFF‘]
矩陣:
list=[ [1,2,3,],[4,5,6],[7,8,9] ] >>> list [[1, 2, 3], [4, 5, 6], [7, 8, 9]] >>> list[0][1] 2 >>> list[1][2] 6
列表原處修改:
>>> food=[‘spam‘,‘eggs‘,‘milk‘]
>>> food[1]
‘eggs‘
>>> food[1]=‘Eggs‘
>>> food[:]
[‘spam‘, ‘Eggs‘, ‘milk‘]
列表的方法
- 列表的添加:
>>>food.append(‘cake‘)
>>> food
[‘spam‘, ‘Eggs‘, ‘milk‘, ‘cake‘]
- 列表的排序:
>>> food.sort()
>>> food
[‘Eggs‘, ‘cake‘, ‘milk‘, ‘spam‘]
- 合並列表:
>>> list1=[1,2,3] >>> list2=[4,5,6] >>> list1.extend(list2) >>> list1 [1, 2, 3, 4, 5, 6]
- 列表的取值:
>>> list1.pop() 6 >>> list1 [1, 2, 3, 4, 5]
- 列表倒序顯示:
>>> list1 [1, 2, 3, 4, 5] >>> list1.reverse() >>> list1 [5, 4, 3, 2, 1]
- 列表的索引:
>>> list=[1,2,3,4,5] >>> list.index(3) 2
- 列表的插入:
>>> list.insert(2,10) >>> list [1, 2, 10, 3, 4, 5]
- 刪除列表的某一個對象:
>>> list [1, 2, 10, 3, 4, 5] >>> del list[2] >>> list [1, 2, 3, 4, 5]
- 列表的排序:
列表的排序默認是先以字母大小寫進行排序的,可以在列表中加一個選項key=lower.str使其都轉換成小寫,使用reverse=True進行倒序排列
>>> list=[‘abc‘,‘aDd‘,‘ace‘]
>>> sorted(list)
[‘aDd‘, ‘abc‘, ‘ace‘]
>>> list
[‘abc‘, ‘aDd‘, ‘ace‘]
>>> sorted(list,key=str.lower,reverse=True)
[‘aDd‘, ‘ace‘, ‘abc‘]
>>> sorted(list,key=str.lower)
[‘abc‘, ‘ace‘, ‘aDd‘]
>>>sorted([x.lower() for x in list])
[‘abc‘, ‘ace‘, ‘add‘]
>>> sorted([x.lower() for x in list],reverse=True)
[‘add‘, ‘ace‘, ‘abc‘]
列表的實際用法
- 取值:
>>> info=[‘myname‘,18,[1997,9,28]] >>> _name,_age,_birth=info >>> _name ‘myname‘ >>> _age 18 >>> _birth [1997, 9, 28] >>> _name,_age,(_birth_y,_birth_m,_birth_d)=info >>> _birth_y 1997 >>> _birth_m,_birth_d (9, 28)
當取的值不固定的時候,可以用*代替:
>>> a=[‘adc‘,122,2215,‘asd@asd‘] >>> a_name,*a_phone,a_mail=a >>> a_name ‘adc‘ >>> a_phone [122, 2215]
- 只保留列表裏最後N個元素:
使用deque函數可以設置列表中的元素個數,如果超過列表最大限制,那麽會將列表裏最左邊的元素刪掉,如果是在左邊添加的,那麽刪除的是最右邊的元素>>> from collections import deque >>> q=deque(maxlen=3) >>> q.append(1) >>> q.append(2) >>> q.append(3) >>> q deque([1, 2, 3], maxlen=3) >>> q.append(4) >>> q deque([2, 3, 4], maxlen=3) >>> q.appendleft(‘5‘) >>> q deque([‘5‘, 2, 3], maxlen=3)
- 取出列表中的最大值和最小值:
使用heapq模塊的nlargest,nsmallest方法來取出列表中的幾個最大值和最小值,當然也可以使用max和min函數來求最大和最小,使用sum函數來求列表數字的和>>> from heapq import nlargest,nsmallest >>> num=[1,4,6,7,8,8,34,64,23,7,45,34] >>> nlargest(3,num) [64, 45, 34] >>> nlargest(2,num) [64, 45] >>> nsmallest(2,num) [1, 4] >>> nsmallest(4,num) [1, 4, 6, 7] >>> num [1, 4, 6, 7, 8, 8, 34, 64, 23, 7, 45, 34] >>> max(num) 64 >>> min(num) 1 >>> sum(num) 241 >>> a_info=[‘wanger‘,‘wangerxiao‘,25,‘computer‘] >>> _name=slice(0,2) >>> _age=slice(2,3) >>> _job=slice(3,4) >>> a_info[_name] [‘wanger‘, ‘wangerxiao‘] >>> a_info[_age] [25] >>> a_info[_job] [‘computer‘]
- 重復元素計算:
這會用到collections模塊的Counter方法>> a=[1,2,3,4,5,6,2,4,2,5,6] >>> from collections import Counter >>> count_word=Counter(a) >>> count_word Counter({2: 3, 4: 2, 5: 2, 6: 2, 1: 1, 3: 1}) >>> count_word.most_common(3) [(2, 3), (4, 2), (5, 2)] >>> count_word.most_common(2) [(2, 3), (4, 2)]
字典
字典在python裏是無序集合對象類型。
字典的值都有獨立的唯一的鍵,用相應的鍵來取值。
python字典主要特性如下: - 通過鍵而不是偏移量來讀取
- 任意對象的無序組合
- 可變長,異構,任意嵌套
- 屬於可映射類型
- 對象引用表
字典用法註意事項:
- 序列運算無效——串聯,分片不能使用
- 對新索引(鍵)賦值會添加項
- 鍵不一定是字符串——只要是不可變的對象(列表字典除外)
字典的基本操作:
-
字典的賦值:
>>> dict={‘a‘:97,‘b‘:98} >>> len(dict) 2 >>> print("ascii code of ‘a‘ is {},ascii code of ‘b‘ is {}".format(dict[‘a‘],dict[‘b‘])) ascii code of ‘a‘ is 97,ascii code of ‘b‘ is 98
-
判斷特定的鍵是否存在於字典裏:
>>> ‘a‘ in dict True >>> ‘b >>>> ‘b‘ is in dict True
- 原處修改:
#更改特定鍵的值 >>> food={‘eggs‘:3,‘ham‘:1,‘spam‘:4} >>> food[‘ham‘]=2 >>> food {‘eggs‘: 3, ‘ham‘: 2, ‘spam‘: 4} #增加新的鍵和相應的值 >>> food[‘branch‘]=[‘bacon‘,‘bake‘] >>> food {‘eggs‘: 3, ‘ham‘: 2, ‘spam‘: 4, ‘branch‘: [‘bacon‘, ‘bake‘]} #刪除一個字典元素 >>> del food[‘eggs‘] >>> food {‘ham‘: 2, ‘spam‘: 4, ‘branch‘: [‘bacon‘, ‘bake‘]} #清空字典所有條目 >>> dict.clear() #刪除字典 del dict
字典的方法
-
查找字典的鍵值是否存在,如果不存在可以設置返回的值
>>> food.get(‘ham‘) 2 >>> dict.get(‘b‘) 2 >>> dict.get(‘0‘) >>> dict.get(‘0‘,‘none‘) ‘none‘
-
創建字典的方法:
1.最原始的方法:dict={‘name‘:‘wanger‘,‘age‘:25}
2.按鍵賦值方法:
>>> dict={} >>> dict[‘name‘]=‘wanger‘ >>> dict[‘age‘]=25
-
字典的比較:
字典的比較會比較字典的鍵,而不是字典的值,可以使用zip方式將字典的值和鍵反過來,這樣就會比較值了,可以使用sorted函數對字典進行排序>>> dict={‘a‘:1,‘b‘:2,‘c‘:3,‘d‘:4} >>> max(dict) ‘d‘ >>> min(dict) ‘a‘ >>> max(zip(dict.values(),dict.keys())) (4, ‘d‘) >>> min(zip(dict.values(),dict.keys())) (1, ‘a‘) >>> sorted(zip(dict.values(),dict.keys())) [(1, ‘a‘), (2, ‘b‘), (3, ‘c‘), (4, ‘d‘)] >>> sorted(zip(dict.values(),dict.keys()),reverse=True) [(4, ‘d‘), (3, ‘c‘), (2, ‘b‘), (1, ‘a‘)]
- 字典列表的排序:
可以使用sorted函數進行排序,使用key參數可以對排序的鍵進行定義,這裏要用到operator模塊的itemgetter函數>>> rows [{‘fname‘: ‘Brian‘, ‘lname‘: ‘Jones‘, ‘uid‘: 1003}, {‘fname‘: ‘David‘, ‘lname‘: ‘Beazley‘, ‘uid‘: 1002}, {‘fname‘: ‘John‘, ‘lname‘: ‘Clesse‘, ‘uid‘: 1001}, {‘fname‘: ‘Big‘, ‘lname‘: ‘Jones‘, ‘uid‘: 1004}] >>> from operator import itemgetter >>> rows_fname=sorted(rows,key=itemgetter(‘fname‘)) >>> rows_fname [{‘fname‘: ‘Big‘, ‘lname‘: ‘Jones‘, ‘uid‘: 1004}, {‘fname‘: ‘Brian‘, ‘lname‘: ‘Jones‘, ‘uid‘: 1003}, {‘fname‘: ‘David‘, ‘lname‘: ‘Beazley‘, ‘uid‘: 1002}, {‘fname‘: ‘John‘, ‘lname‘: ‘Clesse‘, ‘uid‘: 1001}] >>> rows_uid=sorted(rows,key=itemgetter(‘uid‘)) >>> rows_uid [{‘fname‘: ‘John‘, ‘lname‘: ‘Clesse‘, ‘uid‘: 1001}, {‘fname‘: ‘David‘, ‘lname‘: ‘Beazley‘, ‘uid‘: 1002}, {‘fname‘: ‘Brian‘, ‘lname‘: ‘Jones‘, ‘uid‘: 1003}, {‘fname‘: ‘Big‘, ‘lname‘: ‘Jones‘, ‘uid‘: 1004}]
元組
元組簡介
元組與列表非常類似,只是不能在原處更改,元祖在python裏的特點:
- 任意對象的有序組合
- 通過偏移取數據
- 屬於不可變序列類型
- 固定長度,異構,任意嵌套
- 對象引用的數組
元組的創建
元祖創建在只有單個元素的時候,必須加逗號(,),元組裏可以嵌套元組
>>> tuple=()
>>> tuple=(1,)
>>> type(tuple)
<class ‘tuple‘>
#這裏加不加括號都一樣
>>> tuple=(1,2,‘3‘,(4,5))
>>> tuple
(1, 2, ‘3‘, (4, 5))
>>> tuple=1,2,‘3‘,(4,5)
>>> tuple
(1, 2, ‘3‘, (4, 5))
將列表轉換為元組
>>> list=[1,2,3,4]
>>> sd=tuple(list)
>>> sd
(1, 2, 3, 4)
元組的方法
-
元組的排序:
元組經過sorted排序後,會將其轉換為列表>>> tuple=(1,5,3,6,4,2) >>> sorted(tuple) [1, 2, 3, 4, 5, 6]
- 查找元組元素位置:
>>> tuple (1, 5, 3, 6, 4, 2) >>> tuple.index(3) 2
-
計算元組元素數目:
>>> tuple (1, 5, 3, 6, 4, 2) >>> tuple.count(3) 1
-
元組的切片:
>>> tuple[0] 1 >>> tuple[2:] (3, 6, 4, 2) >>> tuple[2:3] (3,)
- 列表和元組的操作類似,列表操作裏只要不是在原處修改的,都可用於元組
>>> (1,2)+(3,4) (1, 2, 3, 4) >>> (1,2)*4 (1, 2, 1, 2, 1, 2, 1, 2) >>> len(tuple) 6
集合
集合簡介
set是一個無序且不重復的元素集合
集合對象十一組無序排列的可哈希的值,集合成員可以做字典中的鍵。set也支持用in 和not in操作符檢查成員,由於集合本身是無序的,不可以為集合創建索引或執行切片操作,也沒有鍵可用來獲取集合中元素的值。
集合特點
- 集合中的元素和字典中的鍵一樣不重復
- 集合中的元素為不可變對象
集合的創建
>>> s=set(‘a‘)
>>> a=set({‘k1‘:1,‘k2‘:2})
>>> b=([‘y‘,‘e‘,‘d‘,‘o‘])
>>> c={‘a‘,‘b‘,‘c‘}
>>> d={(‘a‘,‘b‘,‘c‘)}
集合基本操作
- 集合的比較
#比較a、b集合中a中存在,b中不存在的集合 >>> a={11,22,33} >>> b={11,23,45} >>> a.difference(b) {33, 22} #找到a中存在,b中不存在的集合,並把a、b集合中都有的值覆蓋掉 >>> a={11,22,33} >>> print(a.difference_update(b)) None >>> a {33, 22}
-
集合的刪除:
>>> a={11,22,33} >>> a.discard(11) >>> a.discard(44) >>> a {33, 22} #移除不存在的元素會報錯 >>> a={11,22,33} >>> a.remove(11) >>> a.remove(44) Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 44 >>> a {33, 22} #移除末尾的元素 >>> a={11,22,33} >>> a.pop() 33 >>> a {11, 22}
-
取交集:
#取交集賦給新值 >>> a={1,2,3,4} >>> b={6,5,4,3} >>> print (a.intersection(b)) {3, 4} #取交集並把交集賦給a >>> print (a.intersection_update(b)) None >>> a {3, 4}
- 集合判斷:
>>> a={3,4} >>> b={6,5,4,3} #判斷a是否與b沒有交集,有交集False,無交集True >>> a.isdisjoint(b) False #判斷a是否是b的子集 >>> a.issubset(b) True #判斷a是否是b的父集 >>> a.issuperset(b) False
- 集合合並:
>>> a={1,2,3,4} >>> b={3, 4, 5, 6} #打印不同的元素 >>> print (a.symmetric_difference(b)) {1, 2, 5, 6} #打印不同的元素,並覆蓋到集合a >>> print (a.symmetric_difference_update(b)) None >>> a {1, 2, 5, 6}
- 集合取並集:
>>> a={1, 2, 5, 6} >>> b={3, 4, 5, 6} >>> print (a.union(b)) {1, 2, 3, 4, 5, 6}
-
集合的更新:
>>> a={1, 2, 5, 6} >>> b={3, 4, 5, 6} #把a、b的值合並,並把值賦給集合a >>> a.update(b) >>> a {1, 2, 3, 4, 5, 6} #添加a集合的元素 >>> a.update([7,8]) >>> a {1, 2, 3, 4, 5, 6, 7, 8}
- 集合的轉換:
將集合分別轉換為列表、元組、字符串>>> a=set(range(5)) } >>> li=list(a) >>> tu=tuple(a) >>> st=str(a) >>> print (li) [0, 1, 2, 3, 4] >>> print (tu) (0, 1, 2, 3, 4) >>> print (st) {0, 1, 2, 3, 4}
python文件
文件簡介
文件對象在python裏可以作為操作系統上的文件的鏈接
文件對象的使用方式與之前的字符串、列表等對象不同,它是對文件的輸入、輸出進行控制
在python裏會用open函數來進行文件的控制
文件的訪問
在python裏使用open函數可以訪問文件。
基本格式是:open(<file_address>[,access_mode])
這裏的文件地址是文本形式,在Windows裏由於文件地址是使用反斜杠(),所以,可以使用r來對反斜杠不進行轉義。
例如:
open(r‘C:\mydir\myfile‘)
訪問模式裏是參數,默認是r(讀取)
在訪問模式,每一種方法都有一種使用到b的方式,就是二進制模式。
文件的讀寫參數
操作說明符 | 解釋 |
---|---|
r | 以只讀方式打開文件,這是默認模式 |
rb | 以二進制格式打開一個文件用於只讀。這是默認模式 |
r+ | 打開一個文件用於讀寫 |
rb+ | 以二進制格式打開一個文件用於讀寫 |
w | 打開一個文件只用於寫入。文件存在則覆蓋,不存在,則創建新文件 |
wb | 以二進制格式打開一個文件只用於寫入。文件存在則覆蓋,不存在則創建 |
w+ | 打開一個文件用於讀寫。如果文件已存在則將其覆蓋,不存在則創建新文件。 |
wb+ | 以二進制打開一個文件用於讀寫。如果該文件存在則覆蓋,不存在則創建 |
a | 打開一個文件用於追加,如果文件內容存在,則將新內容追加到文件末尾,不存在則創建新文件寫入 |
ab | 以二進制格式打開一個文件用於寫入 |
a+ | 打開一個文件用於讀寫,如果該文件存在,則會將新的內容追加到文件末尾,如果文件不存在,則創建新文件用於讀寫。 |
ab+ | 以二進制格式打開一個文件用於追加,文件存在將追加,不存在則創建新文件用於讀寫 |
文件的使用
- 叠代器是最好的讀行工具,比如使用for循環
- 內容是字符串,不是對象,文件讀取完之後,內容是以字符串的形式讀取的。
- close是通常選項,當你使用完文件後,使用close方法來關閉文件關聯
- 文件是緩沖而且是可查找的,flush或close()方法可以直接存儲緩存裏的內容,seek方法可以轉到指定位置,當我們使用文件的時候,跟其他對象一樣,用一個變量來引用
例子
>>> file1=open(r‘D:\ruanjian\1.txt‘,‘w‘)
>>> file1.write(‘hello,world‘)
11
>>> file1.close()
>>> file1=open(r‘D:\ruanjian\1.txt‘)
>>> file1.read()
‘hello,world‘
#tell用於獲取文件指針位置,文件讀取之後,文件指針在最後面
>>> file1.tell()
11
>>> file1.close()
>>>> file1=open(r‘D:\ruanjian\1.txt‘)
>>> file1.seek(6)
6
>>> file1.read(5)
‘world‘
文件的讀取
當我們要讀取前五個字符的時候可以這樣:
>>> file1=open(r‘D:\ruanjian\1.txt‘)
>>> file1.read(5)
‘hello‘
>>> file1.tell()
5
當我們要按行讀取的時候,可以使用readline和readlines方法
>>> file1=open(r‘D:\ruanjian\1.txt‘)
>>> file1.readline()
‘hello,world\n‘
>>> file1.readline()
‘wanger\n‘
>>> file1.readline()
‘asdfgghh‘
>>> file1.readline()
‘‘
>>> file1=open(r‘D:\ruanjian\1.txt‘)
>>> file1.readlines()
[‘hello,world\n‘, ‘wanger\n‘, ‘asdfgghh‘]
文件的寫入
當我們需要寫入到一個文件的時候,會使用w模式。當相應的文件存在時,會覆蓋原先的文件然後寫入,當相應的文件不存在時會創建新文件。
-
基本寫入
>>> file=open(r‘D:\ruanjian\1.txt‘,‘w‘) >>> file.write(‘hello,world‘) 11 >>> file.write(‘|wanger‘) 7 >>> file.flush() >>> file.close() >>> file=open(r‘D:\ruanjian\1.txt‘) >>> file.read() ‘hello,world|wanger‘
在這裏flush()方法是把緩存裏的內容寫入硬盤中。當運行close()方法的時候,也會進行同樣操作。
-
按列表寫入:
writelines是把列表裏的元素一個一個輸入進去。當然,元素裏的字符串最後沒有換行,最終結果也不是換行的。>>> list=[‘hello,world!\n‘,‘wanger\n‘,‘asdfgh\n‘] >>> file=open(r‘D:\ruanjian\1.txt‘,‘w‘) >>> file.writelines(list) >>> file.close() >>> file=open(r‘D:\ruanjian\1.txt‘) >>> file.read() ‘hello,world!\nwanger\nasdfgh\n‘
-
在特定位置寫入
當我們輸入錯誤的時候,可以把指針挪到最前面,然後繼續輸入。seek可以有兩個傳遞變量,只有一個變量或者第一個變量為0時,就是更改當前的指針,第二個變量為1的時候,會返回當前指針位置,這個與tell方法同樣,最後,第一個變量為0,第二個變量為2的時候會把指針放到最後>>> file=open(r‘D:\ruanjian\1.txt‘,‘w‘) >>> file.write(‘heelo‘) 5 >>> file.seek(0) 0 >>> file.write(‘hello‘) 5 >>> file=open(r‘D:\ruanjian\1.txt‘) >>> file.read() ‘hello‘
-
在最後寫入
之前看到的w模式,當文件是已有文件,就會刪除裏面的所有內容後再寫入的。當我們需要在最後添加,而不是刪除原有內容時,可以使用a模式。>>> file=open(r‘D:\ruanjian\1.txt‘) >>> file.read() ‘hello‘ >>> file.close() >>> file=open(r‘D:\ruanjian\1.txt‘,‘a‘) >>> file.write(‘my name is wanger‘) 17 >>> file=open(r‘D:\ruanjian\1.txt‘) >>> file.read() ‘hellomy name is wanger‘
在模式裏,我們會看到r+,w+,a+三種模式都有讀寫的方法。
r+模式,只能打開已有文件,打開時保留原有文件,對文件可讀,可寫,也可更改原有內容。打開是指針在文件最前面。
w+模式,打開時沒有相應的文件,會創建;有相應的文件會覆蓋原有的內容
a+模式,可以打開原有文件,也可創建新的文件,打開時指針為文件的最後位置。指針可以放到任何位置來讀內容,但寫入時,指針默認會移動到最後,然後寫入。
模式 | 打開已有文件 | 打開新的文件 | 打開時指針位置 | 寫入時指針位置 |
---|---|---|---|---|
r+ | 保留內容 | 發生錯誤 | 文件開頭 | 當前位置 |
w+ | 刪除內容 | 創建文件 | 文件開頭 | 當前位置 |
a+ | 保留內容 | 創建文件 | 文件尾端 | 文件尾端 |
文件的訪問
- 二進制模式
在這個模式中,在python2.x中不會有什麽特別,因為在2.x裏存儲方式就是二進制方式,但在python3.x裏是Unicode方式。>>> cha=‘啊‘ >>> cha_b=cha.encode() >>> file=open(r‘D:\ruanjian\1.txt‘,‘w‘) >>> file.write(cha) 1 >>> file.write(cha_b) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: write() argument must be str, not bytes >>> file.close() >>> file=open(r‘D:\ruanjian\1.txt‘) >>> file.read() ‘啊‘ >>> file=open(r‘D:\ruanjian\1.txt‘,‘wb‘) >>> file.write(cha) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: a bytes-like object is required, not ‘str‘ >>> file.write(cha_b) 3 >>> file.close() >>> file=open(r‘D:\ruanjian\1.txt‘,‘rb‘) >>> file.read() b‘\xe5\x95\x8a‘
文件與其他類型
- 原生對象的存取
存儲一些對象的時候,比如說列表,字典等;python都需要把這些對象轉換成字符串後存儲:>>> file=open(r‘D:\ruanjian\1.txt‘,‘w‘) >>> file.write({‘a‘:97}) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: write() argument must be str, not dict >>> file.write(str({‘a‘:97})) 9 >>> file.write(str([1,2])) 6 >>> file.close() >>> file=open(r‘D:\ruanjian\1.txt‘) >>> file.read() "{‘a‘: 97}[1, 2]"
如果要將存儲的字符串轉換回原來的數據類型,可以用pickle模塊:
>>> file=open(r‘D:\ruanjian\1.txt‘,‘wb‘)
>>> a={‘a‘:97}
>>> pickle.dump(a,file)
>>> file.close()
>>> file=open(r‘D:\ruanjian\1.txt‘,‘rb‘)
>>> a_=pickle.load(file)
>>> a_
{‘a‘: 97}
打印輸出至文件
需要把打印的內容直接輸出到文件裏的時候:
>>> with open (r‘D:\ruanjian\1.txt‘,‘w‘) as f:
... print (‘hello,world!‘,file=f)
...
>>> with open (r‘D:\ruanjian\1.txt‘) as f:
... f.read()
...
‘hello,world!\n‘
判斷文件是否存在,不存在時寫入
因為w方式對已存在的文件會清楚後寫入,但有的時候我們不想覆蓋原有的文件,我們可以使用如下方式:
>>> if not os.path.exists(r‘D:\ruanjian\1.txt‘):
... with open(r‘D:\ruanjian\1.txt‘,‘wt‘) as f:
... f.write(‘hello,world‘)
... else:
... print (‘file already exists‘)
...
file already exists
在python3.x中我們也可以使用這種方式來判斷文件是否存在,存在的話會報錯,不存在的話文件可以創建
>>> with open(r‘D:ruanjian\2.txt‘,‘xt‘) as f:
... f.write(‘hello\n‘)
...
6
>>> with open(r‘D:ruanjian\2.txt‘,‘xt‘) as f:
... f.write(‘hello\n‘)
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileExistsError: [Errno 17] File exists: ‘D:ruanjian\\2.txt‘
讀寫壓縮文件
文件在存儲時也可以壓縮存儲,需要用到gzip或者bz2模塊,在這兩個模塊中,默認是二進制模式,因此需要使用wt,rt等,指定text模式。讀的時候使用rt,和read()。
壓縮級別可以用compresslevel來設置,也可以使用open裏的encoding,errors,newline等。
>>> with gzip.open(r‘D:\ruanjian\1.gz‘,‘wt‘) as f:
... f.write(‘text‘)
...
4
>>> with gzip.open(r‘D:\ruanjian\1.gz‘,‘rt‘) as f:
... f.read()
...
‘text‘
>>> with bz2.open(r‘D:\ruanjian\1.bz2‘,‘wt‘) as f:
... f.write(‘hello,world‘)
...
11
>>> with bz2.open(r‘D:\ruanjian\1.bz2‘,‘rt‘) as f:
... f.read()
...
‘hello,world‘
獲取文件夾中的文件列表
這要用到os模塊裏的方法,關於os模塊可以查看公眾號的歷史消息,對os模塊有詳細的解釋,這裏只列出一些簡單的方法:
>>> import os
>>> os.getcwd()
‘/root/blog‘
>>> os.listdir(‘.‘)
[‘_config.yml‘, ‘node_modules‘, ‘.gitignore‘, ‘source‘, ‘db.json‘, ‘themes‘, ‘package.json‘, ‘public‘, ‘scaffolds‘, ‘.deploy_git‘]
#當需要判斷是文件時
>>> files=[file for file in os.listdir(‘.‘) if os.path.isfile(os.path.join(‘.‘,file))]
>>> files
[‘_config.yml‘, ‘.gitignore‘, ‘db.json‘, ‘package.json‘]
歡迎各位關註我的微信公眾號
python數據結構之列表、字典、元組、集合