1. 文件操作介绍
大家应该听说过一句话:“好记性不如烂笔头”。
不仅人的大脑会遗忘事情,计算机也会如此,比如一个程序在运行过程中用了九牛二虎之力终于计算出了结果,试想一下如果不把这些数据存放起来,相比重启电脑之后,数据就会丢失
在Python中实现文件的读写操作其实非常简单,通过Python内置的open
函数,我们可以指定文件名、操作模式、编码信息等来获得操作文件的对象,接下来就可以对文件进行读写操作了。这里所说的操作模式是指要打开什么样的文件(字符文件还是二进制文件)以及做什么样的操作(读、写还是追加),具体的如下表所示
2. 文件的读写
文件的读写其实主要分几个部分,文本文件、二进制文件(图片音频视频)、JSON文件,操作上大同小异
示例:
import time
def main():
f = open('F://a.txt', 'r', encoding='utf-8')
print(f.read())
f.close()
# 一次性读取整个文件的内容
with open("F://a.txt","r",encoding='utf-8') as f:
print(f.read())
# 通过for-in循环逐行读取
with open("F://a.txt",mode="r") as f:
for line in f:
print(line,end="")
# 读取文件按行读取到列表中
with open("F://a.txt","r",encoding='utf-8') as f:
lines = f.readlines()
print(lines)
if __name__ == "__main__":
main()
注:通过with
关键字指定文件对象的上下文环境并在离开上下文环境时自动释放文件资源,无须在 finally 关闭文件流
2.1 文本文件
要将文本信息写入文件文件也非常简单,在使用open
函数时指定好文件名并将文件模式设置为'w'
即可。注意如果需要对文件内容进行追加式写入,应该将模式设置为'a'
。下面的例子演示了如何将1-9999之间的素数分别写入三个文件中(1-99之间的素数保存在a.txt中,100-999之间的素数保存在b.txt中,1000-9999之间的素数保存在c.txt中)。
from math import sqrt
#是否是素数
def is_prime(n):
"""判断素数的函数"""
assert n > 0
for x in range(2,int(sqrt(n)) + 1):
if n % x == 0:
return False
return False if n == 1 else True
def main():
filenames = ('F://a.txt',"F://b.txt","F://c.txt")
fs_list = []
try:
for f in filenames:
fs_list.append(open(f,"w",encoding='utf-8'))
for number in range(1,10001):
if is_prime(number):
if number < 100:
print("1:",number)
fs_list[0].write(str(number) + '
')
elif number < 1000:
print("2:",number)
fs_list[1].write(str(number) + '
')
else:
print("3:",number)
fs_list[2].write(str(number) + '
')
except Exception as e:
print(e)
finally:
for fs in fs_list:
fs.close()
print("操作完成")
if __name__ == '__main__':
main()
2.2 二进制文件
了解完文本文件的操作,二进制文件的读写复制也几乎差不多
"""
读写二进制文件
version:0.1
author:coke
"""
def main():
try:
with open("F://aa.jpg","rb") as f1:
data = f1.read()
print(type(data))
with open("F://bb.jpg","wb") as f2:
f2.write(data)
except Exception as e:
print(e)
if __name__ == "__main__":
main()
2.3 JSON文件
我们使用Python中的json模块就可以将字典或列表以JSON格式保存到文件中,代码如下所示。
"""
读取json文件
version:0.1
author:coke
"""
import json
def main():
mydict = {
'name': 'coke',
'age':'19',
'qq':623105972,
'friends':['David','Jack'],
'cars':[
{"brand":"BYD","max_speed":"180"},
{"brand":"BM","max_speed":"190"}
]
}
try:
with open("F://data.json","w",encoding='utf-8') as fs:
json.dump(mydict,fs)
except IOError as e:
print(e)
print("保存数据完成")
if __name__ == '__main__':
main()
json模块主要有四个比较重要的函数,分别是:
dump
- 将Python对象按照JSON格式序列化到文件中dumps
- 将Python对象处理成JSON格式的字符串load
- 将文件中的JSON数据反序列化成对象loads
- 将字符串的内容反序列化成Python对象
import requests
import json
def main():
resp = requests.get("http://api.tianapi.com/guonei/?key=APIKey&num=10")
data_model = json.loads(resp.text)
print(data_model)
print(data_model['code'])
print(data_model['msg'])
if __name__ == '__main__':
main()
3. 文件的定位,重命名和删除
在读写文件的过程中,如果想知道当前的位置,可以使用tell()来获取
如果在读写文件的过程中,需要从另外一个位置进行操作的话,可以使用seek()
seek(offset, from)有2个参数
- offset:偏移量
- from:方向
- 0:表示文件开头
- 1:表示当前位置
- 2:表示文件末尾
os模块中的rename()可以完成对文件的重命名操作,remove()可以完成对文件的删除操作
# -*- coding:utf-8 -*-
"""
文件的定位读写
version:0.1
author:coke
"""
import os
f = open("F://a.txt","r")
str = f.read(2)
print(str)
#查找当前位置
position = f.tell()
print("当前位置:",position)
str = f.read(3)
print(str)
#查找当前位置
position = f.tell()
print("当前位置:",position)
f.seek(1,0)
position = f.tell()
print("seek完当前位置:",position)
f.close()
#关闭文件流才可以 进行重命名和删除
os.rename("F://a.txt","F://rename.txt")
os.remove("F://b.txt")
4. 文件夹的相关操作
实际开发中,有时需要用程序的方式对文件夹进行一定的操作,比如创建、删除等
就像对文件操作需要os模块一样,如果要操作文件夹,同样需要os模块
import os
from time import sleep
#创建文件夹
if not os.path.exists("F://tempDir"):
os.mkdir("F://tempDir")
#获取当前目录
currentDir = os.getcwd()
print(currentDir)
print("--------------")
#改变默认目录
os.chdir("F://")
#获取默认目录
defaultDir = os.listdir("./")
print(defaultDir)
#过5秒删除文件
sleep(5)
os.rmdir("F://tempDir")