1. 程式人生 > >python數據結構之列表、字典、元組、集合

python數據結構之列表、字典、元組、集合

以及 微信公眾 更改 section nas 操作類 lis lse 超過

列表

列表在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數據結構之列表、字典、元組、集合