在前面學習了基本的打開和建立文件之后,就可以對文件進行多種多樣的操作了。請看官要注意,文件,不是什么特別的東西,就是一個對象,如同對待此前學習過的字符串、列表等一樣。
## 文件的屬性
所謂屬性,就是能夠通過一個文件對象得到的東西。
~~~
>>> f = open("131.txt","a")
>>> f.name
'131.txt'
>>> f.mode #顯示當前文件打開的模式
'a'
>>> f.closed #文件是否關閉,如果關閉,返回True;如果打開,返回False
False
>>> f.close() #關閉文件的內置函數
>>> f.closed
True
~~~
## 文件的有關狀態
很多時候,我們需要獲取一個文件的有關狀態(有時候成為屬性,但是這里的文件屬性和上面的文件屬性是不一樣的,可是,我覺得稱之為文件狀態更好一點),比如創建日期,訪問日期,修改日期,大小,等等。在os模塊中,有這樣一個方法,能夠解決此問題:
~~~
>>> import os
>>> file_stat = os.stat("131.txt") #查看這個文件的狀態
>>> file_stat #文件狀態是這樣的。從下面的內容,有不少從英文單詞中可以猜測出來。
posix.stat_result(st_mode=33204, st_ino=5772566L, st_dev=2049L, st_nlink=1, st_uid=1000, st_gid=1000, st_size=69L, st_atime=1407897031, st_mtime=1407734600, st_ctime=1407734600)
>>> file_stat.st_ctime #這個是文件創建時間
1407734600.0882277 #換一種方式查看這個時間
>>> import time
>>> time.localtime(file_stat.st_ctime) #這回看清楚了。
time.struct_time(tm_year=2014, tm_mon=8, tm_mday=11, tm_hour=13, tm_min=23, tm_sec=20, tm_wday=0, tm_yday=223, tm_isdst=0)
~~~
以上關于文件狀態和文件屬性的內容,在對文件的某些方面進行判斷和操作的時候或許會用到。特別是文件屬性。比如在操作文件的時候,我們經常要首先判斷這個文件是否已經關閉或者打開,就需要用到file.closed這個屬性來判斷了。
## 文件的內置函數
~~~
>>> dir(file)
['__class__', '__delattr__', '__doc__', '__enter__', '__exit__', '__format__', '__getattribute__', '__hash__', '__init__', '__iter__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'closed', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'mode', 'name', 'newlines', 'next', 'read', 'readinto', 'readline', 'readlines', 'seek', 'softspace', 'tell', 'truncate', 'write', 'writelines', 'xreadlines']
>>>
~~~
這么多內置函數,不會都講述,只能撿著重點的來實驗了。
~~~
>>> f = open("131.txt","r")
>>> f.read()
'My name is qiwsir.\nMy website is qiwsir.github.io\nAha,I like program\n'
>>>
~~~
file.read()能夠將文件中的內容全部讀取過來。特別注意,這是返回一個字符串,而且是將文件中的內容全部讀到內存中。試想,如果內容太多是不是就有點慘了呢?的確是,千萬不要去讀大個的文件。
~~~
>>> contant = f.read()
>>> type(contant)
<type 'str'>
~~~
如果文件比較大了,就不要一次都讀過來,可以轉而一行一行地,用readline
~~~
>>> f = open("131.txt","r")
>>> f.readline() #每次返回一行,然后指針向下移動
'My name is qiwsir.\n'
>>> f.readline() #再讀,再返回一行
'My website is qiwsir.github.io\n'
>>> f.readline()
'Aha,I like program\n'
>>> f.readline() #已經到最后一行了,再讀,不報錯,返回空
''
~~~
這個方法,看官是不是覺得太慢了呢?有沒有痛快點的呢?有,請揮刀自宮,不用自宮,也能用readlines。注意區別,這個是復數,言外之意就是多行啦。
~~~
>>> f = open("131.txt","r")
>>> cont = f.readlines()
>>> cont
['My name is qiwsir.\n', 'My website is qiwsir.github.io\n', 'Aha,I like program\n']
>>> type(cont)
<type 'list'>
>>> for line in cont:
... print line
...
My name is qiwsir.
My website is qiwsir.github.io
Aha,I like program
~~~
從實驗中我們可以看到,readlines和read有一樣之處,都是將文件內容一次性讀出來,存放在內存,但是兩者也有區別,read返回的是str類型,readlines返回的是list,而且一行一個元素,因此,就可以通過for逐行打印出來了。
在print line中,注意觀察list里面的每個元素,最后都是一個\n結尾,所以打印的結果會有空行。其原因前面已經介紹過了,忘了的朋友請回滾到[上一講](https://github.com/qiwsir/ITArticles/blob/master/BasicPython/130.md)
不過,還是要提醒列位,太大的文件不用都讀到內存中。對付大點的文件,還是推薦這么做:
~~~
>>> f = open("131.txt","r")
>>> f
<open file '131.txt', mode 'r' at 0xb757c230>
>>> type(f)
<type 'file'>
>>> for line in f:
... print line
...
My name is qiwsir.
My website is qiwsir.github.io
Aha,I like program
~~~
以上都是讀文件的內置函數和方法。除了讀,就是要寫。所謂寫,就是將內容存入到文件中。用到的內置函數是write。但是,要寫入文件,還要注意打開文件的模式,可以是w,也可以是a,看具體情況而定。
~~~
>>> f = open("131.txt","a") #因為這個文件已經存在,我又不想清空,用追加的模式
>>> f.write("There is a baby.") #這句話應該放到文件最后
>>> f.close() #請看官注意,寫了之后,一定要及時關閉文件。才能代表真正寫入
~~~
看看寫的效果:
~~~
>>> f = open("131.txt","r")
>>> for line in f.readlines():
... print line
...
My name is qiwsir.
My website is qiwsir.github.io
Aha,I like program
There is a baby. #果然增加了這一行
~~~
以上是關于文件的基本操作。其實對文件遠遠不知這些,有興趣的看官可以google一下pickle這個模塊,是一個很好用的東西。
- 第零部分 獨上高樓,望盡天涯路
- 嘮叨一些關于Python的事情
- 為什么要開設本欄目
- 第一部分 積小流,至江海
- Python環境安裝
- 集成開發環境(IDE)
- 數的類型和四則運算
- 啰嗦的除法
- 開始真正編程
- 初識永遠強大的函數
- 玩轉字符串(1):基本概念、字符轉義、字符串連接、變量與字符串關系
- 玩轉字符串(2)
- 玩轉字符串(3)
- 眼花繚亂的運算符
- 從if開始語句的征程
- 一個免費的實驗室
- 有容乃大的list(1)
- 有容乃大的list(2)
- 有容乃大的list(3)
- 有容乃大的list(4)
- list和str比較
- 畫圈還不簡單嗎
- 再深點,更懂list
- 字典,你還記得嗎?
- 字典的操作方法
- 有點簡約的元組
- 一二三,集合了
- 集合的關系
- Python數據類型總結
- 深入變量和引用對象
- 賦值,簡單也不簡單
- 坑爹的字符編碼
- 做一個小游戲
- 不要紅頭文件(1): open, write, close
- 不要紅頭文件(2): os.stat, closed, mode, read, readlines, readline
- 第二部分 窮千里目,上一層樓
- 正規地說一句話
- print能干的事情
- 從格式化表達式到方法
- 復習if語句
- 用while來循環
- 難以想象的for
- 關于循環的小伎倆
- 讓人歡喜讓人憂的迭代
- 大話題小函數(1)
- 大話題小函數(2)
- python文檔
- 重回函數
- 變量和參數
- 總結參數的傳遞
- 傳說中的函數條規
- 關于類的基本認識
- 編寫類之一創建實例
- 編寫類之二方法
- 編寫類之三子類
- 編寫類之四再論繼承
- 命名空間
- 類的細節
- Import 模塊
- 模塊的加載
- 私有和專有
- 折騰一下目錄: os.path.<attribute>
- 第三部分 昨夜西風,亭臺誰登
- 網站的結構:網站組成、MySQL數據庫的安裝和配置、MySQL的運行
- 通過Python連接數據庫:安裝python-MySQLdb,連接MySQL
- 用Pyton操作數據庫(1):建立連接和游標,并insert and commit
- 用Python操作數據庫(2)
- 用Python操作數據庫(3)
- python開發框架:框架介紹、Tornado安裝
- Hello,第一個網頁分析:tornado網站的基本結構剖析:improt模塊、RequestHandler, HTTPServer, Application, IOLoop
- 實例分析get和post:get()通過URL得到數據和post()通過get_argument()獲取數據
- 問候世界:利用GAE建立tornado框架網站
- 使用表單和模板:tornado模板self.render和模板變量傳遞
- 模板中的語法:tornado模板中的for,if,set等語法
- 靜態文件以及一個項目框架
- 模板轉義
- 第四部分 暮然回首,燈火闌珊處
- requests庫
- 比較json/dictionary的庫
- defaultdict 模塊和 namedtuple 模塊
- 第五部分 Python備忘錄
- 基本的(字面量)值
- 運算符
- 常用的內建函數
- 擴展閱讀(來自網絡文章)
- 人生苦短,我用Python