1. 文件读取
1.1 file文件
file文件读取:只能写入字符串,如果要写入字符串以外的数据,先将他转换为字符串,文件内的数据不容易操作
#文件打开
file.open()
#文件关闭
file.close()
#读取文件
file.read()
#读取一行
file.readline()
#读取一行,返回列表
file.readlines()
#写
file.write()
#写一行
file.writelines()
#返回文件当前的指针位置
file.tell()
#设置光标位置,0代表文件开头,1代表文件当前位置,2代表文件末尾
file.seek(偏移量,0|1|2)
#读取文件后,截取n行
file.truncate(n)
#读取文件内容
with open('info.txt','rt',encoding='utf8') as file:
emp=file.read()
print(emp)
#文件内容写入
with open('note.txt','wt+') as fa:
fa.write(str(c+d))
fa.seek(0)
print(fa.read())
1.2 shelve:以键值对的形式存储,键必须是字符串,值可以是任意类型,方便操作
import shelve
d=shelve.open('a.txt')
#存储信息
d['tom']={'age':18,'sex':'male'}
#修改信息
d['tom']={'age':20,'sex':'male'}
#访问文件
d['tom']['sex']
#关闭文件
d.close()
1.3 pickle:将python支持的数据,进行序列化的存取
import pickle
#pickle.dump(obj, file)
#必填参数obj表示将要封装的对象
#必填参数file表示obj要写入的文件对象,file必须以二进制可写模式打开,即“wb”
data = ['aa', 'bb', 'cc']
with open('text', 'wb') as f:
#写入文件,只能写一次
pickle.dump(data, f)
with open('text', 'rb') as f:
#读取文件
result = pickle.load(f)
print(result)
2. os模块
定义:os模块是方便与操作系统相互交互的模块
功能:系统相关、目录及文件操作、执行命令和管理进程
import os
#列出指定目录的文件和文件夹
os.listdir(path)
#获取当前路径
os.getcwd()
#删除目录或多层目录
os.rmdir/removerirs()
#将分离的各部分组成一个路径名
os.path.join(path1,path2)
#判断是否为目录(文件夹),参数为绝对路径
0s.path.isdir(path)
#判断是否为文件,参数为绝对路径
0s.path.isfile(path)
#当前系统的类型
os.name
#删除文件
os.remove()
#生成目录树下的所有文件名
os.walk(path)
#创建目录/多层目录
os.mkdir/makedirs(dirname)
#返回当前文件的绝对路径
os.path.abspath('文件名')
#判断路径是否存在
os.path.exists(path)
#返回上一级目录
os.chdir('..')
#进入到当前目录
os.chdir('c:/user/86178/desktop/1234')
3. sys模块
#命令行参数List,第一个元素是程序本身路径
sys.argv
#返回操作系统平台名称
sys.platform
#返回python解释器版本信息
sys.version
退出程序,sys.exit(0)
sys.exit(n)
#标准输出
sys.stdout.write()print
#标准输入
sys.stdin.readline()input
#返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.path
练习1:
# ①打开并读取文件 info.txt中的内容
# ②将读到的文件内容,存入到变量emp_info
import re,sys,os,datetime,calendar,time
with open('info.txt','rt',encoding='utf8') as file:
emp_info=file.read()
print(emp_info)
# ③在emp_info内,用正则获取到新师面试的日期,输出出来
a=re.findall(r'[\d]{4}-[\d]{2}-[\d]{2}',emp_info)
print(a[0])
# ④面试不通过,将在20天后还有二次面试的机会,计算二次面试的日期。
b=time.strptime(a[0],'%Y-%m-%d')
print(b)
c=datetime.date(b[0],b[1],b[2])
d=datetime.timedelta(days=20)
print(f'二次面试的日期为:{c+d}')
# ⑤用正则获取到新师所有的成绩,并输出
e=re.findall(r'[\d]{2}\.[\d]{1}',emp_info)
print(e)
# ⑥计算出这位新师刘丽丽的面试平均成绩
# ⑦如果平均成绩高于97.5请输出一句话:可以录取,如果低于97.5则手动抛出一个异常。
# ⑧异常被捕获之后,输出:请准备于XX月XX日参加二次面试(写上二次面试的日期)
f=[float(i) for i in e]
print(f)
try:
g=sum(f)/len(f)
print(f'刘丽丽的平均成绩为:{g}')
print('可以录取')
if g<97.5:
raise Exception
except Exception:
print('请准备于7月11日参加二次面试')
# ⑨在pycharm当前目录下,新建文件note.txt,将二次面试的日期写入
with open('note.txt','wt+') as fa:
fa.write(str(c+d))
fa.seek(0)
print(fa.read())
# ⑩用正则获取到刘丽丽邮箱,将邮箱一同写入note.txt中(不要删除日期)
h=re.findall(r'[\w]{7}@qq.com',emp_info)
print(h[0])
# ⑪获取你pycharm当前的工作目录
print(os.getcwd())
# ⑫获取当前的目录下的所有文件及文件夹
print(os.listdir(os.getcwd()))
练习2:
# 1.编写Python程序,实现如下功能:
# (1)编写函数,可以求出100 - 999之间所有的水仙花数,并返回。
# (2)调用该函数,将得到所有水仙花数据写入文件t1.txt
# (3)使用文件操作方式打开t1.txt文件,读取文件内容,并打印出来
def number():
ls=[]
for i in range(100,999):
if (i%10)**3+(i//10%10)**3+(i//100%10)**3==i:
ls.append(i)
ls1=[str(i) for i in ls]
return ' '.join(ls1)
with open('t1.txt','wt') as f:
g=f.write(number())
print(g)
f.close()
with open('t1.txt','rt') as f1:
h=f1.read(g)
print(h)
f1.close()
# 2.编写Python程序,实现如下功能:
# (1)手动创建名为t2.txt的文件,将以下内容添加到文件中
# This is a message
# tony是一个名副其实的iron - man。
# tony其实是个男人。
# 谁说tony是坏人?
# 你们真逗,tony再厉害,也掩饰不住资深富人的气质。
with open('t2.txt','wt',encoding='utf8') as ff:
fa=ff.write('This is a message\ntony是一个名副其实的iron - man。\ntony其实是个男人。\n谁说tony是坏人?\n你们真逗,tony再厉害,也掩饰不住资深富人的气质')
# print(fa)
# (2)使用文件操作方式打开t2.txt文件:
with open('t2.txt', 'rt+', encoding='utf8') as ff:
fb=ff.read()
b = str(fb).replace('tony', 'TONY')
# print(b)
# (3)将文件中所有的tony都替换成大写的TONY
b = str(fb).replace('tony', 'TONY')
# print(b)
# with open('t2.txt', 'r+', encoding='utf8') as ff:
d=ff.write(b)
print(d)
ff.close()
# (4)使用文件操作方式打开t2.txt文件,读取文件内容,并打印出来
with open('t2.txt','rt',encoding='utf8') as aa:
c=aa.read(d)
print(c)
练习3:
# 5.写Python程序,完成如下功能。
# ①生成1 - 100
# 之间所有能被3整除的整数,保存在列表alist中并输出
# ②将alist的所有元素写入文件test3.txt中
# ③通过读方式打开test.txt文件,读取该文件中的内容并打印输出
alist=[]
for i in range(1,100):
if i%3==0:
alist.append(i)
print(alist)
ls=[str(i) for i in alist]
l=' '.join(ls)
# print(l)
with open('test3.txt','wt') as f:
la=f.write(l)
print(la)
with open('test.txt','rt') as f1:
lb=f1.read(la)
print(lb)
# 1.使用文件处理,完成以下操作
# (1)文件信息写入
# ①编程创建一个新文件,文件名称为c.txt
# ②利用代码,查找出1-100之间所有能被3整除的数字
# ③将上一问中的数字,写入到c.txt文件
# (2)文件信息写出
# ①重新打开文件c.txt,获取文本内容
# ②将文本内容进行处理,获取
ls=[]
for i in range(1,100):
if i%3==0:
ls.append(i)
方法一
with open('c.txt','wt',encoding='utf8') as file:
b=file.write(str(ls))
with open ('c.txt','rt',encoding='utf8') as f:
f.read(b)
f.seek(0,0)
print(f.read())
方法二
with open('c.txt','rt+',encoding='utf8') as file:
# file.write(str(ls))
# file.seek(0,0)
# c=file.read()
# print(c)
练习4:
# 2.1)现在有一份‘邀请函.txt’的空白文件,请在同级目录下,编写一段代码,将内容‘诚挚邀请您来参加本人生日晚会’写入。
with open('邀请函.txt','wt+',encoding='utf8') as fa:
fa.write('诚挚邀请您来参加本人生日晚会\n')
# 2)在第一题的基础上,添加上问候语和发件人,内容是’best regards 李帆’,让内容看起来是:
# 诚挚邀请您来参加本次宴会
# best regards
# 李帆
fa.write('best regards\n')
fa.write('李帆')
print(fa)
fa.seek(0,0)
b=fa.read()
print(b)
练习5:
# 3)在第二题的基础上,这封邮件需要发送给‘丁二’、‘张美丽’、‘韩梦’三位朋友,请在邮件内容开头处添加收件人名字,并且生成相应名字的邮件。邮件内容应该为:
# 丁二:
# 诚挚邀请您来参加本次宴会
# best regards
# 李帆
import shelve,pickle
with open('邀请函.txt','wt+',encoding='utf8') as fa:
# fa.write('诚挚邀请您来参加本人生日晚会\n')
fa.write('诚挚邀请您来参加本次宴会\nbest regards\n李帆')
fa.seek(0)
f = fa.read()
with open('丁二.txt','rb+') as fb:
pickle.dump('丁二:\n'+f,fb)
fb.seek(0,0)
c=pickle.load(fb)
print(c)
fb.close()
print('----------------------')
with open('张美丽.txt','rb+') as fc:
pickle.dump('张美丽:\n'+f,fc)
fc.seek(0,0)
d=pickle.load(fc)
print(d)
fc.close()
print('-----------------------')
with open('韩梦.txt','rb+') as fd:
pickle.dump('韩梦:\n'+f,fd)
fd.seek(0,0)
e=pickle.load(fd)
print(e)
fb.close()
# with open('丁二.txt','wt+',encoding='utf8') as fb:
# fb.write('丁二:\n')
# fb.write(b)
# fb.seek(0,0)
# c=fb.read()
# print(c)
# fb.close()
# with open('张美丽.txt','wt+',encoding='utf8') as fb:
# fb.write('张美丽:\n')
# fb.write(b)
# fb.seek(0,0)
# d=fb.read()
# print(d)
# fb.close()
# with open('韩梦.txt','wt+',encoding='utf8') as fb:
# fb.write('韩梦:\n')
# fb.write(b)
# fb.seek(0,0)
# e=fb.read()
# print(e)
# fb.close()
练习6:
# 4)编写Python程序,实现如下功能:
# t2.txt的数据: Repetition is the mother of all learning重复是学习之母。
# ①读取文件t2.txt的数据保存在astr中并输出
# ②将astr中所有的小写字母都转为大写,原大写字母不变,得到一个新的数据并输出
# ③使用合适方法截取t2.txt文件,只保留原始数据的前10个字节
# ④打开确认是否正确截取
with open('t2.txt','rt+',encoding='utf8') as ff:
ff.write('Repetition is the mother of all learning重复是学习之母')
ff.seek(0,0)
astr=ff.read()
print(astr)
a=astr.upper()
print(a)
b=ff.truncate(10)
print(b)
# 5)新建名为work的源程序文件,编写Python程序,完成如下功能。(30分)
# (1)(1) 将已经给定的文件work.jpg放置到桌面上,并读取(提示:不是文本文件)查看、输出读取的内容
# (2)再将读取的内容写入到pycharm当前目录下的wk.jpg中(如果无此文件就创建1个)
# (3)将图片work.jpg中的3行文字逐行写入wk.txt中(如果无此文件就创建1个)
# (4)读取中wk.txt的内容,放入words 中
# (5)将内容中的'你'替换成'you'
with open(r'C:\Users\86178\Desktop\work.jpg','rb') as fc:
c=fc.read()
print(c)
with open(r'wk.jpg','wb+') as f:
f.write(c)
f.seek(0)
print(f.read())
with open(r'wk.txt','wt+',encoding='utf8') as fb:
fb.writelines('自己不努力,别人帮你是情分,不帮你是本分,别人也不会帮你')
# print(fb.sell())
fb.seek(0,0)
b=fb.read()
print(b)
c=b.replace('你','you')
print(c)
练习7:
# 2.使用os,sys完成以下操作
# (1)查看操作系统平台名称
print(sys.platform)
# (2)查看python解释程序的版本信息
print(sys.version)
# (3)查看当前工作目录
print(os.getcwd())
# (4)在当前工作目录下,使用异常处理解决新建空目录adir时出现的错误:
# 如果空目录不存在,新建
# 如果空目录已存在,提示已存在
if not os.path.exists(r'E:\untitled2\datedate\adir'):
os.mkdir(r'E:\untitled2\datedate\adir')
else:
print('提示已存在')
# (5)查看当前工作目录下的所有文件和目录
# (6)输出当前工作目录下所有文件和目录的绝对路径
for i in os.listdir(os.getcwd()):
i1=os.path.abspath(i)
print(i1)
练习7:
import os
# (1)输出pycharm当前的工作目录及文件
print(str(os.listdir(os.getcwd())))
print('--------------------------------------------------------------')
# (2)以追加的方式打开文件week2.txt(提示:考试题中已经给出此文件)
# (3)读出week2.txt中的内容(注意文件指针位置)
with open('week2.txt','at+',encoding='utf8') as f:
# f.seek(0)
# f.read()
f.write(str(os.listdir(os.getcwd())))
f.seek(0)
g=f.read()
print(g)
# (4)将当前工作目录中的文件和目录名追加写入新文件week2.txt
# (5)在当前工作目录中再新建xx和yy这2个空目录
if not os.path.exists('xx'):
os.mkdir('xx')
if not os.path.exists('yy'):
os.mkdir('yy')
# (6)接着在week2.txt中写入字符串“---------”,
with open('week2.txt','wt',encoding='utf8') as f:
f.write('---------\n')
# (7)最后将当前工作目录中所有的目录再次写入week2.txt
f.write(str(os.listdir(os.getcwd())))
练习8:
# 1)以读写方式打开给定的info.txt文件
import os,sys,re
with open(r'C:\Users\86178\Desktop\06-1人工能学院Python6月周考3\info.txt','rt',encoding='utf8') as file:
# 2)读取文件中的所有内容,放入my_st之中
my_st=file.read()
print(my_st)
# 3)在当前的pycharm工作目录下新建2个文件夹mytel,mybox
if not os.path.exists('mytel'):
os.mkdir('mytel')
if not os.path.exists('mybox'):
os.mkdir('mybox')
# 4)输出当前目录下所有的文件和文件夹
b=os.getcwd()
c=os.listdir(b)
print(c)
# 5)用指令删除新建的文件夹mybox
if os.path.exists('mybox'):
os.rmdir('mybox')
# 6)查看当前目录中的所有文件,确保mytel已经创建,mybox已经删除
d=os.listdir(os.getcwd())
print(d)
# 7)获取7(上一题目)中所有文件的绝对路径,并写入到当前目录下新建的文件my_path.txt之中
with open('my_path.txt','wt',encoding='utf8') as ff:
for i in d:
e=os.path.abspath(i)
ff.write(e)
# 8)输出系统的版本号
print(sys.version)
# 9)匹配出my_st中所有北京的电话号码,格式如010-XXXXXXXX(其中010为北京区号)
j=re.findall('010-[\d]{8}',my_st)
print(j)
# 10)把这些号码写入到mytel下的新建文件tel.txt之中
os.chdir('mytel')
for i in j:
with open('tel.txt','a+') as fa:
fa.write(i+'\n')
# 11)每行电话号码写入后,进行换行
# 12)用正则匹配,再将my_st中找出所有类似2021-9这样的时间(年,月)获取并输出
print(re.findall('[\d]{4}-[\d]{1,2}', my_st))
# 13)再编写一个正则表达式reg,用来获取163邮箱
reg=r'[\d\w]{6,10}@163\.com'
print(re.findall(reg, my_st))
# 14)用reg从my_st中匹配一个163邮箱并输出
练习9:
# 1.使用正则和相关python模块完成以下操作(每小题4分)
# 1)获取并输出你pycharm的系统版本号
import re,os,sys
# 2)在你的pycharm中,获取当前的工作目录,放入cf之中,输出cf下的所有文件及文件夹
cf=os.getcwd()
print(cf)
print(os.listdir(cf))
# 3)定义一个函数show_files(ph),参数ph代表一个目录(或路径),功能是输出ph下所有的文件和文件夹
def show_files(ph):
os.chdir(ph)
print(os.listdir(ph))
# show_files(r'C:\Users\86178\Desktop')
# 4)打开并读取的zhang.txt文件,放入stu中
with open(r'C:\Users\86178\Desktop\07-1人工能学院Python7月周考3\zhang.txt','rt',encoding='utf8') as file:
stu=file.read()
print(stu,type(stu))
# 5)用正则,从stu中提取到张宝的入学日期并输出
da=re.findall(r'[\d]{4}-[\d]{1,2}-[\d]{2}',stu)
print(da[0])
# 6)用正则,从stu中提取到张宝的所有成绩并输出
db=re.split(r',|;', stu)
print(db)
la=[]
for i in db:
c=re.search(r'成绩[\d]{2}\.?[\d]?$',i)
if c:
aaa=c.group()
la.append(aaa)
print(la)
for i in la:
d = re.search(r'[\d]{2}\.?[\d]?$', i)
print(d.group())
# 7)用正则,从stu中提取到张宝的电子信箱并输出
print(re.search(r'[\w]{6,10}@(qq|163|126)\.com', stu).group())
# 8)在当前的pycharm工作目录下新建3个文件夹zh_score,zh_mail,zh_date
ls=['zh_score','zh_mail','zh_date']
for i in ls:
if not os.path.exists(i):
os.mkdir(i)
# 9)调用函数show_files,输出当前目录下所有的文件和文件夹
print(os.getcwd())
show_files(os.getcwd())
# 10)用指令删除新建的文件夹zh_date
if os.path.exists('zh_date'):
os.rmdir('zh_date')
# 11)在zh_score中创建文件note.txt,并写入5)和6)中的内容:张宝的入学日期,张宝的成绩
import pickle
with open('note.txt','ab+') as f:
pickle.dump(da[0],f)
with open('note.txt','ab+') as fl:
for i in la:
d = re.search(r'[\d]{2}\.?[\d]?$', i)
pickle.dump(d.group(),fl)
with open('note.txt','rb+') as fa:
print(pickle.load(fa))
if not os.path.exists('zh_score'):
os.makedirs(r'zh_score')
os.chdir('zh_score')
with open('note.txt','wt+',encoding='utf8') as fb:
fb.write(da[0]+'\n')
for i in la:
d = re.search(r'[\d]{2}\.?[\d]?$', i)
fb.write(d.group()+'\n')
fb.seek(0,0)
print(fb.read())
# 12)在zh_score中创建文件note2.txt,并写入以下内容:
with open('note2.txt','wt+',encoding='utf8') as fc:
fc.write('2021年中伏天从7月21号开始,饮食应注意:\n'
'1.去除湿气\n'
'2.应注意少糖\n'
'3.避开冰冷食物\n'
'4.应以开胃为主\n'
'5.应多食干粮\n'
'6.补气去火')
fc.seek(0)
print(fc.read())
# 13)调用函数show_files,输出zh_score下所有的文件和文件夹
show_files(r'E:\untitled2\python2\8月28日\zh_score')
# 14)输出zh_score下所有的文件和文件夹的绝对路径
bb=os.path.abspath('zh_score')
print(bb)
cc=os.chdir(r'E:\untitled2\python2\8月28日\zh_score')
# os.chdir('..')
print(os.listdir(cc))
练习10:
# 3.['吴文哲','刘鑫','冯鑫','杨欣冉','王欢']请在D盘的根目录下分别创建几个文件夹,分别以这几位同学的姓名命名。
# 请把创建的文件夹删除,并做到重复删除时不报错误。
print('---------------------------------------')
a=['吴文哲','刘鑫','冯鑫','杨欣冉','王欢']
for i in a:
os.chdir(r'D:')
os.mkdir(i)
try:
os.rmdir(i)
except:
print('重复删除')
# 4.在你的桌面上建文件夹目录如下:人工智能\1911A\jack
if not os.path.exists(r'C:\Users\86178\Desktop\人工智能\1911A\jack'):
os.makedirs(r'C:\Users\86178\Desktop\人工智能\1911A\jack')