iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 23
0
自我挑戰組

Python 學習筆記系列 第 23

Day23 Python 基礎 - 文件操作_V2

接下來做一個比較有趣的應用,來實做一個進度條

#!/usr/bin/env python3
# -*- coding:utf-8 -*-


import sys, time

for i in range(20):
    sys.stdout.write("#")
    sys.stdout.flush()
    time.sleep(0.5)

這個代碼,各位可以試試看,挺有趣的應用…

closed 判斷文件是不是關閉,為真返回True

再來講一下 truncate(),這個是

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

f = open('foo.txt', 'a', encoding='utf-8')
f.truncate()

---------------執行結果---------------

Hello Python
Hello Python1
Hello Python2
Hello Python3
Hello Python4

打開文件的模式改成用a,發現並不會去截斷字符串,那如果改成truncate(4),看看會有什麼不同?

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

f = open('foo.txt', 'a', encoding='utf-8')
f.truncate(4)

---------------執行結果---------------

Hell

觀察發現,怎麼字符串從第四個之後被截斷了,這是因為truncate(4)的關係,那我們在加入先前學到的seek(),能不能從特定指定的位置之後開始截斷字符串,那要怎麼做呢?


#!/usr/bin/env python3
# -*- coding:utf-8 -*-

f = open('foo.txt', 'a', encoding='utf-8')
f.seek(10)
f.truncate(7)

---------------執行結果---------------

Hello P

有發現了嗎?怎麼還是一樣是從頭開始截7個字符串,完全沒有依照原本的想像,從指定的第10個字符串開始往後截斷,所以由此可知,truncate()截斷的標準,完全不受seek()影響的

先前示範的代碼都只能讀只能寫,接下來我們讓讀寫同時在一起好了,也順便觀察一下,有什麼不一樣的地方

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

f = open('foo.txt', 'r+', encoding='utf-8')
print(f.readline())
print(f.readline())
f.write("----------我是分隔線----------")
print(f.readline())

---------------執行結果---------------

Hello Python
Hello Python1
Hello Python2
Hello Python3
Hello Python4----------我是分隔線----------

咦,奇怪了,怎麼不是在第二行寫入----------我是分隔線----------,怎麼跑到最後一行了?等於其實因為是r+這個關係,是用讀取跟寫入的方式打開文件,不相信?好吧,那我們就來打印一下游標位置,確認一下是怎麼運作

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

f = open('foo.txt', 'r+', encoding='utf-8')
print(f.readline())
print(f.readline())
print(f.tell())
f.write("----------我是分隔線----------")
print(f.readline())

---------------執行結果---------------

Hello Python

Hello Python1

27
Hello Python2


Process finished with exit code 0

觀察文件內容:
Hello Python
Hello Python1
Hello Python2
Hello Python3
Hello Python4----------我是分隔線--------------------我是分隔線----------

觀察一下,上面的代碼,的確真的是以讀寫的方法打開文件了,那剛剛使用r+,那換使用w+,觀察一下,跟r+有什麼不同?

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

f = open('foo.txt', 'w+', encoding='utf-8')
print(f.readline())
print(f.readline())
print(f.tell())
f.write("----------我是分隔線----------")
print(f.readline())

---------------執行結果---------------

0


Process finished with exit code 0

觀察文件內容:
----------我是分隔線----------

唔!!!怎麼只剩一行----------我是分隔線----------?這是因為f = open('foo.txt', 'w+', encoding='utf-8')這一句的關係,先打開一個文件叫foo.txt,接著因為w會有truncate的作用,所以不管原本文件裡面有什麼,都會被清空,然後在用寫入至文件裡面,所以上面的代碼執行完畢後,才會只剩下一行,又不相信?好吧,那就再來實驗一下,確認一下到底是怎麼運作的…

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

f = open('foo.txt', 'w+', encoding='utf-8')
print("目前游標起始位置:", f.tell())
f.write("----------我是第一行----------\n")
f.write("----------我是第二行----------\n")
f.write("----------我是第三行----------\n")
f.write("----------我是第四行----------\n")
f.write("----------我是第五行----------\n")
print("目前游標位置:", f.tell())
f.seek(10)
print("游標返回的位置:", f.tell())
print(f.readline())
f.write("My name is Tony Stark, I'm ironman")
print("最後游標的位置:", f.tell())
f.close()

---------------執行結果---------------

目前游標起始位置: 0
目前游標位置: 180
游標返回的位置: 10
我是第一行----------

最後游標的位置: 214

Process finished with exit code 0

觀察文件內容:
----------我是第一行----------
----------我是第二行----------
----------我是第三行----------
----------我是第四行----------
----------我是第五行----------
My name is Tony Stark, I'm ironman

咦,正常應該要從我是第一行----------這邊開始寫入的,但就是真的沒辦法寫,因為w+是做寫入更新,所以即使游標返回特定位置,一樣不受影響,只會寫在文件裡的最後一行


上一篇
Day22 Python 基礎 - 文件操作_V2
下一篇
Day24 Python 基礎 - 文件操作_V2
系列文
Python 學習筆記29

尚未有邦友留言

立即登入留言