Python 文件操作與josn–數據存儲
1 文件操作
- 讀寫文件是最常見的IO操作。Python內置了讀寫文件的函數,用法和C是兼容的。
讀寫文件前,我們先必須瞭解一下,在磁盤上讀寫文件的功能都是由操作系統提供的,現代操作系統不允許普通的程序直接操作磁盤,所以,讀寫文件就是請求操作系統打開一個文件對象(通常稱爲文件描述符),然後,通過操作系統提供的接口從這個文件對象中讀取數據(讀文件),或者把數據寫入這個文件對象(寫文件)。- 操作文件的函數/方法
在python中要操作文件需要記住一個函數和三個方法
python中一切皆對象
open :打開文件,並且返回文件操作對象
read :將文件內容讀取到內存
write:將指定的內容寫入到文件
close:關閉文件
open 函數負責打開文件,並且返回文件對象
read/wirte/close三個方法都需要通過文件對象調用- read方法–讀取文件
open的第一個參數是要打開的文件明(文件名區分大小寫)
如果文件存在,返回文件操作對象
如果文件不存在,會拋出異常
read方法可以一次性讀入並返回文件的所有內容
close方法負責關閉文件
編輯TEST文件:
內容:
I’m used for test.
通過python進行打開
1.1 文件的讀取
# 1. 打開文件
open方法:負責打開文件
執行如下:
f = open('TEXT')
# TEXT 文件與本 .py python源文件在同一目錄下,故不需要添加絕對路徑
# 2.讀取文件
# read方法:負責讀取文件,
# 可一次性讀入並返回文件的所有內容
f.read()
test = f.read()
print = test
# 3.關閉文件
# close方法:負責關閉文件
f.close()
# 在開發中,通常會先編寫打開和關閉的代碼
執行如下:
控制檯顯示如下:
顯示了文件的內容
1.2 文件指針:
- 文件指針:
文件指針標記從哪個位置開始讀取數據
第一次打開文件時,通常文件指針會指向文件的開始位置
當執行了read方法後,文件指針會移動到讀取內容的末尾
示例:
f = open('TEXT') # 打開文件
text = f.read() # 定義 text 爲讀取文件
print text # 顯示 text 結果
print type(text) # 顯示類型
print len(text) # 顯示 text 長度
print '#' * 50
text = f.read() # 再次定義 text
print text # 查看文件內容
print len(text)
f.close()
執行如下:
控制檯顯示如下:
後面顯示爲 0 是因爲,文件指針,在調用文件內容後,直接指到了文件最後,因此不會顯示任何內容,當然沒有長讀可言
1.3 寫文件
- 執行方式
file = open(‘filename’,’action’)
常用的方法有’w’,’a’
其中’w’爲覆蓋,’a’爲追加
1.4 覆蓋
- 以’w’方式打開文進阿
如果該文件存在,原文件內容會被覆蓋
如果文件不存在,創建文件並寫入
示例:
file = open('TEST','w') # 以寫的方式打開文件
test = file.write('HELLO')
file.close() # 關閉文件
file = open('TEST')
print file.read() # 顯示文件,查看文件內容
file.close() # 關閉文件
執行如下:
控制檯顯示如下:
1.5 追加
- 以追加方式打開文件
如果該文件存在,文件指針會放在文件的末尾
如果文件不存在,創建文件並寫入
示例:
f = open('TEST')
f = open('TEST')
print f.read()
f.close()
f = open('TEST', 'a')
f.write('python') # 追加到文件內容的後面
# 若想換行追加可在要追加內容前加上 \n 換行符號
f.close()
f = open('TEST')
print f.read()
執行如下:
控制檯顯示如下:
1.6 文件的逐行讀取
若是文件內容過大直接將文件的全部內顯示到控制檯,此時需要逐行對文件內容進行顯示
示例:
文件TEXT的內容爲
HELLOpython
python
通過python進行查看
import time # 調用 time 函數
test = open('/etc/passwd')
while True:
text = test.readline()
print text, # ',' 表示取消換行
time.sleep(1) # time.sleep(1) 表示每隔 1 秒顯示一次
if not text:
break
test.close()
執行如下:
控制檯顯示如下:
在一行一行的進行顯示
1.7 文件的複製
1.7.1 全部複製
示例
# 1.打開文件
# 源文件以只讀的方式打開
file_read = open('TEST')
# 目標文件以寫的方式打開
file_write = open('TEST_COPY','w')
# 從源文件中讀取內容
text = file_read.read()
# 將讀取到的內容寫到目標文件中
fiel_write.write(text)
# 關閉文件
file_read.close()
file_write.close()
執行如下:
複製成功後,將會出現文件TESST_COPY
其內容,與TEST內容相同
1.7.2 逐行復制
對文本內容進行逐行復制
示例:
test = open('/etc/passwd')
test_write = open('passwd_copy', 'w')
while True:
text = test.readline() # 逐行對要複製的文件進行讀取
if not text: # 如果文件指針指到最後,則退出循環
break
test_write.write(text) # 將text的內容寫入新文件
test_write.close()
test.close()
執行如下:
複製的新文件的內容如下:
1.8 文件打開的第二種方式:with
- 通過 with 進行對文件內容的查看
關鍵字 with 在不需要訪問文件後將其關閉,在這個程序中,
我們調用了open(),但沒有調用close();也可以調用 open() 和 close 來打開
和關閉文件,但這樣做時,如果程序存在bug,導致close()語句沒有執行,
文件將不會關閉,未妥善地關閉文件可能會導致數據丟失或受損,
如果在程序中過早地調用close(),
你會發現需要使用文件時它已經關閉(無法訪問),
這會導致更多地錯誤,你並非在任何情況下都能輕鬆地確定關閉文件地恰當時機
通過使用with結構,可讓python去確定,
你只管打開文件,並在需要時使用它,
python會在合適的時候自動將其關閉
以 TEST文件爲例:
TEST文件內容如下:
示例:
# 通過with的方式進行文件的打開
with open('TEST') as file_object:
# 調用read方法進行文件內容的查看
contents = file_object.read()
print contents
執行如下:
控制檯顯示如下:
逐行對文件進行讀取
filename = 'TEST'
with open(filename) as file_object:
# 通過for語句,逐行對文件進行讀取
for line in file_object:
print line
執行如下:
控制檯顯示如下:
對文件進行寫入
# 將文件名用變量進行表示,文件若不存在,執行程序後
# 會自動新建文件,並執行操作
filename = 'python'
# 以寫的方式進行文件的打開
with open(filename, 'w') as file_object:
# 寫入如下內容,添加換行符,進行換行添加
file_object.write('I love study.\n')
file_object.write('I love python.')
# 以默認讀的方式進行打開
with open(filename) as file_object:
# 在控制檯顯示文件內容
print file_object.read()
執行如下:
控制檯顯示如下:
對文件內容進行添加
# 將文件名用變量進行表示
filename = 'python'
# 以添加的方式進行文件的打開
with open(filename, 'a') as file_object:
# 添加如下內容,添加換行符,進行換行添加
file_object.write('I love study.\n')
file_object.write('I love python.')
# 以默認讀的方式進行打開
with open(filename) as file_object:
# 在控制檯顯示文件內容
print file_object.read()
執行如下:
控制檯顯示如下:
對文件內容進行復制
# 將文件名用變量進行表示
filename = 'python'
f = 'python_copy'
# 以讀的方式打開要進行復制的文件
with open(filename) as file_obj:
test = file_obj.read()
# 以寫的方式打開府之後的文件
with open(f, 'w') as file_object:
# 將要進行復制的文件的內容,添加到新的文件中
file_object.write(test)
# 以默認讀的方式進行打開
with open(f) as file_object:
# 在控制檯顯示覆制後的文件的內容
print file_object.read()
執行如下:
控制檯顯示如下:與上面的python的文件內容完全相同
2 josn–數據存儲
- json(javascriptObject notation)格式最初是爲javascript開發的,但隨後成了一種常見格式,被包括python在內的衆多語言採用
很多程序都要求用戶輸入某種信息,
程序都把用戶提供的信息存儲在列表和字典等數據結構中,
用戶關閉程序時,你幾乎總是要保存他們的信息:
一種簡單的方式是使用模塊 json 來存儲數據
(在python中使用json的時候,主要也就是使用json模塊,json是以一種良好的格式來進行數據的交互)
模塊 json 讓你能夠將簡單的 Python 數據結構轉存到文件中,
並在程序再次運行時加載該文件中的數據,
你還可以使用 json 在 Python 程序之間分享數據,
更重要的是, json 數據格式並非 Python 專用的,
這讓你能夠將以json格式存儲的數據與使用其他編程語言的人分享
通過 json 進行數據的存儲與調用
通過 json.dump 方法將數據導入文件中
import json # 調用 json 模塊
number = [1,2,3,4] # 定義列表
with open('numbers.json','w') as f_obj:
# 我們使用函數json.dump()將數字列表存儲到文件中
json.dump(number,f_obj)
執行如下:
產生的存儲文件的內容如下:
* .json 中存儲的數據一般是數據結構,在python 中就是,列表,字典等*
通過 json.load 方法加載存儲在 .json 中的信息
示例:
import json
filename = 'numbers.json'
with open(filename) as f_obj:
# 我們使用函數json.load加載存儲在numbers.json中的信息
# 並將其存儲到變量numbers中
numbers = json.load(f_obj)
print numbers
執行如下:
控制檯顯示如下:
json 應用示例
- 如果以前存儲了用戶,就顯示,否則,就提示用戶輸入用戶名並存儲它
代碼如下:
import json
filename = "username.json"
try:
with open(filename) as f_obj:
username = json.load(f_obj)
except ValueError:
username = raw_input("What is you name? ")
with open(filename,"w") as f_obj:
json.dump(username,f_obj)
print "We'll remember you when you come back %s" % username
#依賴於try代碼塊成功執行的代碼都應放到else代碼塊中:
else:
print "Welcome back %s " % username
執行如下:
控制檯顯示如下:
若是沒有用戶
若是有用戶