天天看點

使用for循環周遊檔案

使用 Python 通路檔案,首先得先打開檔案,在 Python 下打開檔案可以使用 open 内置函數

open

r——以隻讀方式打開

w——以寫的方式打開

a——以追加模式打開

r+——以讀寫模式打開

w+——以讀寫模式打開(參見w)

a+——以讀寫模式打開(參見a)

rb——以二進制讀模式打開(binary)

wb——以二進制寫模式打開(參見w)

ab——以二進制追加模式打開(參見a)

rb+——以二進制讀寫模式打開(參見r+)

wb+——以二進制讀寫模式打開(參見w+)

ab+——以二進制讀寫模式打開(參見a+)

with open

我們試着打開一個檔案如下:

In [1]: open('/tmp/tmp.txt')
Out[1]: <open file '/tmp/tmp.txt', mode 'r' at 0x1ba6150>

In [2]: fd=open('/tmp/tmp.txt')     #用一個參數fd接收一下

In [3]: type(fd)              #可以看到fd是檔案類型
Out[3]: file           

檔案會有很多方法可以使用,比如 fd.close,打開一個檔案也需要關閉它:

In [4]: fd.
fd.close       fd.flush       fd.next        fd.seek        fd.writelines
fd.closed      fd.isatty      fd.read        fd.softspace   fd.xreadlines
fd.encoding    fd.mode        fd.readinto    fd.tell        
fd.errors      fd.name        fd.readline    fd.truncate    
fd.fileno      fd.newlines    fd.readlines   fd.write       

In [5]: fd.close()         #關閉檔案           

然後我們再已讀寫的方式打開之前那個檔案:

In [6]: fd=open('/tmp/tmp.txt','w')          #以讀寫的方式打開這個檔案

In [7]: fd
Out[7]: <open file '/tmp/tmp.txt', mode 'w' at 0x1ba6270>

In [8]: fd.wri
fd.write       fd.writelines  

In [8]: fd.write("a")                        #往檔案裡面寫入一個a,在這個時候會覆寫檔案原有的内容

In [9]: fd.clo
fd.close   fd.closed  

In [9]: fd.close()                               接着我們關閉這個檔案           

接着我們以讀寫的方式寫入一個“123”,然後再往檔案裡面追加一個“456”:

In [10]: fd=open('/tmp/tmp.txt','w')

In [11]: fd.write("123\n")

In [12]:

In [12]: fd.close()

In [13]:

In [13]: fd=open('/tmp/tmp.txt','a')

In [14]: fd.write("456\n")

In [15]: fd.close()           

檔案内容變化如下:

[root@izj6cdhdoq5a5z7lfkmaeaz ~]# cat /tmp/tmp.txt
123
[root@izj6cdhdoq5a5z7lfkmaeaz ~]#
[root@izj6cdhdoq5a5z7lfkmaeaz ~]# cat /tmp/tmp.txt
123
456           

以隻讀模式打開檔案如下:

In [16]: fd=open('/tmp/tmp.txt','r')

In [17]: fd.read()                  
Out[17]: '123\n456\n'

In [18]: fd.read()                   
'''因為讀取第二遍的時候是往後讀取的,
後面沒有内容,是以傳回的就是空的'''

Out[18]: ''

In [19]: fd.read()
Out[19]: ''           

read方法的比較:

In [19]: fd.read()                  #傳回的是一個字元串
Out[19]: ''

In [20]: fd.readline()            #傳回的是一個字元串
Out[20]: ''

In [21]: fd.readlines()          #傳回的是一個清單
Out[21]: []           

我們把打開一個檔案的操作腳本寫入一個檔案:

[root@izj6cdhdoq5a5z7lfkmaeaz ~]# cat openfile.py
#!/usr/local/python3/bin/python

fd=open("/tmp/tmp.txt")
for i in fd.readlines():
    print(i)
[root@izj6cdhdoq5a5z7lfkmaeaz ~]#
[root@izj6cdhdoq5a5z7lfkmaeaz ~]# python openfile.py
123

456

[root@izj6cdhdoq5a5z7lfkmaeaz ~]#           

由上面我們可以看到打開檔案内容預設會顯示空行,我們去掉空行,如下所示:

[root@izj6cdhdoq5a5z7lfkmaeaz ~]# cat openfile.py       
#!/usr/local/python3/bin/python

fd=open("/tmp/tmp.txt")
for i in fd.readlines():
    print(i,end='')
[root@izj6cdhdoq5a5z7lfkmaeaz ~]#
[root@izj6cdhdoq5a5z7lfkmaeaz ~]#
[root@izj6cdhdoq5a5z7lfkmaeaz ~]#
[root@izj6cdhdoq5a5z7lfkmaeaz ~]# python openfile.py
123
456
[root@izj6cdhdoq5a5z7lfkmaeaz ~]#           

我們一般建議在實際讀取檔案的時候去掉 read 方法,因為當檔案非常大的時候,讀取出來将消耗很大一部分的記憶體,一般直接進行如下代碼即可:

[root@izj6cdhdoq5a5z7lfkmaeaz ~]# cat openfile.py   
#!/usr/local/python3/bin/python

fd=open("/tmp/tmp.txt")
for i in fd:       #這樣周遊的就是一個對象,對象會一行一行的取值讀出來
    print(i,end='')
[root@izj6cdhdoq5a5z7lfkmaeaz ~]#
[root@izj6cdhdoq5a5z7lfkmaeaz ~]#
[root@izj6cdhdoq5a5z7lfkmaeaz ~]# python openfile.py
123
456
[root@izj6cdhdoq5a5z7lfkmaeaz ~]#