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
执行如下:
控制台显示如下:
若是没有用户
若是有用户