接下來做一個比較有趣的應用,來實做一個進度條
#!/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+
是做寫入更新
,所以即使游標返回特定位置,一樣不受影響,只會寫在文件裡的最後一行