**這兩天身體不給力,拖欠了每天發講座的約定,看官見諒。**
紅頭文件,是某國特別色的東西,在python里不需要,python里要處理的是計算機中的文件,包括文本的、圖片的、音頻的、視頻的等等,還有不少沒見過的擴展名的,在linux中,不是所有的東西都被保存到文件中嗎?文件,在python中,是一種對象,就如同已經學習過的字符串、數字等一樣。
先要在交互模式下查看一下文件都有哪些屬性:
~~~
>>> 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']
~~~
然后對部分屬性進行詳細說明,就是看官學習了。
## 打開文件
在某個文件夾下面建立了一個文件,名曰:130.txt,并且在里面輸入了如下內容:
~~~
learn python
http://qiwsir.github.io
qiwsir@gmail.com
~~~
此文件一共三行。
下圖顯示了這個文件的存儲位置:

在上面截圖中,我在當前位置輸入了python(我已經設置了環境變量,如果你沒有,需要寫全啟動python命令路徑),進入到交互模式。在這個交互模式下,這樣操作:
~~~
>>> f = open("130.txt") #打開已經存在的文件
>>> for line in f:
... print line
...
learn python
http://qiwsir.github.io
qiwsir@gmail.com
~~~
提醒初學者注意,在那個文件夾輸入了啟動python交互模式的命令,那么,如果按照上面的方法`open("130.txt")`打開文件,就意味著這個文件130.txt是在當前文件夾內的。如果要打開其它文件夾內的文件,請用相對路徑或者絕對路徑來表示,從而讓python能夠找到那個文件。
將打開的文件,賦值個變量f,這樣也就是變量f跟對象文件130.txt用線連起來了(對象引用)。
接下來,用for來讀取文件中的內容,就如同讀取一個前面已經學過的序列對象一樣,如list、str、tuple,把讀到的文件中的每行,賦值給變量line。也可以理解為,for循環是一行一行地讀取文件內容。每次掃描一行,遇到行結束符號\n表示本行結束,然后是下一行。
從打印的結果看出,每一樣跟前面看到的文件內容中的每一行是一樣的。只是行與行之間多了一空行,前面顯示文章內容的時候,沒有這個空行。或許這無關緊要,但是,還要深究一下,才能豁然。
在原文中,每行結束有本行結束符號\n,表示換行。在for語句匯總,print line表示每次打印完line的對象之后,就換行,也就是打印完line的對象之后會增加一個\n。這樣看來,在每行末尾就有兩個\n,即:\n\n,于是在打印中就出現了一個空行。
~~~
>>> f = open('130.txt')
>>> for line in f:
... print line, #后面加一個逗號,就去掉了原來默認增加的\n了,看看,少了空行。
...
learn python
http://qiwsir.github.io
qiwsir@gmail.com
~~~
在進行上述操作的時候,有沒有遇到這樣的情況呢?
~~~
>>> f = open('130.txt')
>>> for line in f:
... print line,
...
learn python
http://qiwsir.github.io
qiwsir@gmail.com
>>> for line2 in f: #在前面通過for循環讀取了文件內容之后,再次讀取,
... print line2 #然后打印,結果就什么也顯示,這是什么問題?
...
>>>
~~~
如果看官沒有遇到上面問題,可以試試。遇到了,這就解惑。不是什么錯誤,是因為前一次已經讀取了文件內容,并且到了文件的末尾了。再重復操作,就是從末尾開始繼續讀了。當然顯示不了什么東西,但是python并不認為這是錯誤,因為后面就會講到,或許在這次讀取之前,已經又向文件中追加內容了。那么,如果要再次讀取怎么辦?就重新來一邊好了。
特別提醒看官,因為當前的交互模式是在該文件所在目錄啟動的,所以,就相當于這個實驗室和文件130.txt是同一個目錄,這時候我們打開文件130.txt,就認為是在本目錄中打開,如果文件不是在本目錄中,需要寫清楚路徑。
比如:在上一級目錄中(~/Documents/ITArticles/BasicPython),加入我進入到那個目錄中,運行交互模式,然后試圖打開130.txt文件。

~~~
>>> f = open("130.txt")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: '130.txt'
>>> f = open("./codes/130.txt") #必須得寫上路徑了(注意,windows的路徑是\隔開,需要轉義。對轉義符,看官看以前講座)
>>> for line in f:
... print line
...
learn python
http://qiwsir.github.io
qiwsir@gmail.com
>>>
~~~
## 創建文件
上面的實驗中,打開的是一個已經存在的文件。如何創建文件呢?
~~~
>>> nf = open("131.txt","w")
>>> nf.write("This is a file")
~~~
就這樣創建了一個文件?并寫入了文件內容呢?看看再說:

真的就這樣創建了新文件,并且里面有那句話呢。
看官注意了沒有,這次我們同樣是用open()這個函數,但是多了個"w",這是在告訴python用什么樣的模式打開文件。也就是說,用open()打開文件,可以有不同的模式打開。看下表:
| 模式 | 描述 |
| --- | --- |
| r | 以讀方式打開文件,可讀取文件信息。 |
| w | 以寫方式打開文件,可向文件寫入信息。如文件存在,則清空該文件,再寫入新內容 |
| a | 以追加模式打開文件(即一打開文件,文件指針自動移到文件末尾),如果文件不存在則創建 |
| r+ | 以讀寫方式打開文件,可對文件進行讀和寫操作。 |
| w+ | 消除文件內容,然后以讀寫方式打開文件。 |
| a+ | 以讀寫方式打開文件,并把文件指針移到文件尾。 |
| b | 以二進制模式打開文件,而不是以文本模式。該模式只對Windows或Dos有效,類Unix的文件是用二進制模式進行操作的。 |
從表中不難看出,不同模式下打開文件,可以進行相關的讀寫。那么,如果什么模式都不寫,像前面那樣呢?那樣就是默認為r模式,只讀的方式打開文件。
~~~
>>> f = open("130.txt")
>>> f
<open file '130.txt', mode 'r' at 0xb7530230>
>>> f = open("130.txt","r")
>>> f
<open file '130.txt', mode 'r' at 0xb750a700>
~~~
可以用這種方式查看當前打開的文件是采用什么模式的,上面顯示,兩種模式是一樣的效果。下面逐個對各種模式進行解釋
**"w":以寫方式打開文件,可向文件寫入信息。如文件存在,則清空該文件,再寫入新內容**
131.txt這個文件是存在的,前面建立的,并且在里面寫了一句話:This is a file
~~~
>>> fp = open("131.txt")
>>> for line in fp: #原來這個文件里面的內容
... print line
...
This is a file
>>> fp = open("131.txt","w") #這時候再看看這個文件,里面還有什么呢?是不是空了呢?
>>> fp.write("My name is qiwsir.\nMy website is qiwsir.github.io") #再查看內容
>>> fp.close()
~~~
查看文件內容:
~~~
$ cat 131.txt #cat是linux下顯示文件內容的命令,這里就是要顯示131.txt內容
My name is qiwsir.
My website is qiwsir.github.io
~~~
**"a":以追加模式打開文件(即一打開文件,文件指針自動移到文件末尾),如果文件不存在則創建**
~~~
>>> fp = open("131.txt","a")
>>> fp.write("\nAha,I like program\n") #向文件中追加
>>> fp.close() #這是關閉文件,一定要養成一個習慣,寫完內容之后就關閉
~~~
查看文件內容:
~~~
$ cat 131.txt
My name is qiwsir.
My website is qiwsir.github.io
Aha,I like program
~~~
其它項目就不一一講述了。看官可以自己實驗。
本講先到這里,明天繼續文件。感冒藥吃了,昏昏欲睡。
## 使用with
在對文件進行寫入操作之后,一定要牢記一個事情:`file.close()`,這個操作千萬不要忘記,忘記了怎么辦,那就補上吧,也沒有什么天塌地陷的后果。
有另外一種方法,能夠不用這么讓人揪心,實現安全地關閉文件。
~~~
>>> with open("130.txt","a") as f:
... f.write("\nThis is about 'with...as...'")
...
>>> with open("130.txt","r") as f:
... print f.read()
...
learn python
http://qiwsir.github.io
qiwsir@gmail.com
hello
This is about 'with...as...'
>>>
~~~
這里就不用close()了。而且這種方法更有python味道,或者說是更符合Pythonic的一個要求。
- 第零部分 獨上高樓,望盡天涯路
- 嘮叨一些關于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