os模块对目录的操作
os.getcwd():查看当前所在目录
os.chdir():改变当前目录
os.mkdir():在当前目录下创建新的子目录,也可以指定路径创建
os.rmdir():删除目录,前提是目录为空
os.listdir():显示目录下内容,包括子目录和文件
os.chmod():修改文件或目录的权限
os模块对文件的操作
删除:os.remove(file_name),参数可以带路径
重命名:os.rename(current_file_name, new_file_name)
#再shell环境下
import os
dir(os)#查看它的成员方法
help(os.mkdir)#查看模块的具体信息
#os.mkdir('abc')
os.rmdir('abc')
文件
文件的分类:文本文件和二进制文件
1)文本文件:存储的是字符串
2)二进制文件:存储的是字节码,广泛用于存储各种程序数据,如图像、音频、视频等。
open函数打开文件
open函数----返回文件对象 f=open(file, mode='r', encoding=None,...)
重要参数说明:
1)file是指文件名,可含目录。打开文件的时候一定要带上目录或者确认当前目录下有该文件存在,否则会出现文件找不到的错误
2)mode表示文件打开模式,默认为’rt’即以只读模式打开文本文件
3)encoding表示文件的编码模式,系统的默认编码是utf-8
当前路径,绝对路径(有盘符),上级目录(..或者.),相对路径
关于上下文管理语句with
实际开发中,读写文件应优先考虑使用上下文管理语句with,关键字with可以自动管理资源,不论因为什么原因(哪怕代码异常)跳出with块时,总能保证文件被正常关闭,可以在代码块执行完毕后自动还原到进入该代码块时的上下文,常用于文件操作、数据库连接、网络通信连接等场合。
用于文件时语法如下: with open(filename, mode, encoding) as fp: #底下是操作fp的语句
例如:
with open(’abc.txt’) as f:
s=f.read()
for s in f: 这一结构将使得s自动遍历f文件对象中的每一行. 当文件对象作为for循环的序列时,文件中的每一行构成一个 单独的序列元素
f.write()不会主动换行,如果要换行,要么s含换行符,要么使用f.write(s+’\n’)
代码
1.读取行文件操作
with open('再别康桥.txt','r',encoding='utf-8') as f:
num=0
for s in f:
print(s,end='')
num+=1
#打印诗句的行数
print('\n这首诗一共有',num,'行')
with open('再别康桥.txt', 'r',encoding='utf-8') as f:
lines = f.readlines()
num = 0
for s in lines:
print(s, end='')
num += 1
# 打印诗句的行数
print('\n这首诗一共有', num, '行')
with open('再别康桥.txt', 'r',encoding='utf-8') as f:
num=0
while True:
s=f.readline()
if not s:
break
print(s,end='')
num+=1
print('\n这首诗一共有', num, '行')
2.写入文件
with open('诗歌.txt','w',encoding='utf-8') as f:
s=input('请逐行输入诗歌,空行视为文件结束\n')
while (s): #循环运行的条件是s为非零值
f.write(s+'\n')
s=input()
#循环结束
print('创作结束,生成诗歌.txt文件!')
poem=[]
print('请逐行输入诗歌,空行视为文件结束\n')
while True:
s=input()
if not s:
break
poem.append(s+'\n')
with open('诗歌.txt','w',encoding='utf-8') as f:
f.writelines(poem)
print('创作结束,生成诗歌.txt文件!')
3.其他文件组合操作
#回车换行占2个字符,空格1个,r+模式追加
import os
with open('123.txt','r+',encoding='utf-8') as f:
print('初始内容如下: \n')
print(f.read())
print()
print()
f.write('smile to the world\n')
f.write('hi, morning\n')
#随即读取空文件指定位置的信息
f.seek(0) #文件的索引从0开始
print(f.read(3)) #读3个字符
position=f.tell()#获取当前的位置
print('当前位置是',position)
print(f.read(4))
f.seek(13)
print(f.read(4)) #到13号位,读4个字符
f.write('hi, afternoon')
print('最后内容如下: ')
f.seek(0)#定位文件的开始
print(f.read()) #显示整个文件的内容
4.创建目录
import os
print('当前目录是',os.getcwd())
godir=input('请输入你要去的目录:\n') #d:\\去D盘符
os.chdir(godir)
while True:
s=input('请输入你要创建的目录名: ')
if s:
os.mkdir(s)
else:
break
print('程序结束,再见')
5.读入要查找的学生名字,从StuInfo.txt搜索该学生信息,如果有该学生,则打印相关信息,否则显示无此学生打开文件时使用with上下文管理!
name=input('请输入要查询的学生名字: ')
with open('StuInfo.txt','r',encoding='utf-8') as f:
stus=f.readlines()
find=False #寻找标记,记录是否找到这个学生,初始值为False
for s in stus:
curr=s.split(',')
if curr[1]==name:#如果当前信息行中名字与要查询的名字相同
print(s) #打印该学生信息
find=True#修改寻找标记为True
break
if not find:
print('没有找到这个学生')
#对应文本
2016001001,张三,男,18,13912345678
2016001002,李四,男,19,13922222222
2016001003,王五,女,18,13933333333
2016001004,郑六,男,17,13944444444
2016001005,孙俪,男,16,13955555555
2016001006,刘备,男,19,13966666666
2016001007,草狼,男,20,13977777777
6.读入Staffs_2030.txt,找出其中本年度考核为优秀的员工,加薪20%,薪水四舍五入后统一保留整数位。然后重新写入Staffs_2031.txt中,新旧文件的编码方式均为’utf-8’
with open('Staffs_2030.txt','r',encoding='utf-8') as f:
allStaffs=[] #此列表用于存放修改后的所有员工的信息
for s in f:
s=s.rstrip()#去掉末尾的换行符
curr=s.split(',')
#分解后得到的curr,六号位是考核的
if len(curr)<=1:
continue
if curr[6]!='优秀':#如果考核结果不是优秀
allStaffs.append(s)
else:
curr_salary=round(int(curr[5])*1.2) #工资
curr[5]=str(curr_salary)
new_mess=','.join(curr)#将列表转换为字符串并加入
allStaffs.append(new_mess)#将该员工的新信息写入
with open('Staffs_2031.txt','w',encoding='utf-8') as fw:
#下面的for 语句:将allStaffs中存放的员工新信息写入该文件中
for i in allStaffs:
fw.write(i+'\n')
print('已根据2030信息生成2031对应的文件')
#对应文本
工号,姓名,职位,年龄,工龄,工资,考核结果
00001,曹恒,总经理,40,10,30000,优秀
00002,郑武,经理,34,8,18000,及格
00007,李飞,经理,34,8,15600,优秀
00019,张白,经理,28,6,140000,及格
00035,王柳,经理,34,4,19200,优秀
01002,张小明,职员,26,3,8000,及格
01004,李笑笑,职员,25,3,10800,优秀
01006,张三,职员,25,3,8400,优秀
01009,李四,职员,23,3,5000,及格
01013,王五,职员,21,1,6000,优秀
01015,郑六,职员,21,1,4000,及格
01016,宋七,职员,21,1,4800,优秀
7.已知当前目录下“5班学生信息.txt”文件内容,如下图所示编写程序h_newStus.py,实现如下功能:不断从终端读入某同学的姓名,如果输入为空表示结束录入工作。否则,判断是否和文件中的已有人名匹配,如果匹配就输出“与已有同学重名,建议转班”,否则输出“无重名,该同学可以加入本班,请录入新同学信息:性别、年龄和电话号码,以逗号分隔’,然后将该同学信息加入到“5班学生信息.txt”中,该学生的学号自动生成,将最后同学的学号加1即可
with open('abc.txt','r',encoding='utf-8') as f:
lines=f.readlines() #用列表接收,读出行数
while True:
#读入新转入学生的姓名
name=input('请输入新同学的名字: ')
if not name:#如果输入的是空,则打断死循环,录入工作结束
break
find=False#默认查找序号
lastNum=0#该变量用于记录已有学生最大的学号值
#for循环中将遍历已有所有学生的信息,判断是否有这个新转让名字
for line in lines:
stu=line.strip() #将行首和行末的空白字符全部去掉
if not stu: #如果遇到空串,不合适的行跳过
continue
stu=stu.split(',')#到了这一行,说明匹配到学生信息,用逗号对原始文件进行切割
if name==stu[1]:#如果当前行的名字刚好和新同学重名
print('和现有同学重名,建议调整去隔壁班级')#打印重命名
find=True#找到了这个学生
break#中断for语句
else:
lastNum=int(stu[0])
if not find: #如果not find,说明没有重名的同学
print('没有重名的同学,该同学加入班级')
mess=input('请输入该学生的性别,年龄,手机号码,以逗号分隔: \n')
#现在将新同学加入班级名单中
lines.append(str(lastNum+1)+','+name+','+mess+'\n')#str(lastNum+1)表示已有同学的学号+1就是新同学的学号,
# 转成字符串,先用列表装起来
print('添加该学生成功,学号是',lastNum+1)
with open('abc.txt','w',encoding='utf-8') as fw: #进行写入操作
for s in lines:
fw.write(s)
print('录入工作结束,再见')
#abc.txt
11001001,张三,男,18,13912345678
11001002,李四,男,19,13922222222
11001003,王五,女,18,13933333333
11001004,郑六,女,17,13944444444
11001005,孙俪,男,16,13955555555
11001006,刘备,男,19,13966666666
11001007,草狼,男,20,13977777777
#提前结束按回车
1)显示当前目录
2)读入用户指定的文件,该文件包含将要创建的各 客户名称,如“客户信息”,要求该文件的某列为客户姓名,各信息之间用逗号隔开,我们将根据所有的客户姓名为他们创建个人目录
3)读入用户想要创建的所有客户个人目录的父目录,要求该目录已经在系统中存在,然后读入用户名在文件中的第几列
4)根据用户信息文件创建所有客户目录
import os
print('当前的目录是',os.getcwd())
filename=input('请输入用户信息文件:\n')
with open(filename,'r',encoding='utf-8') as f:
targetDir=input('请输入要创建的各客户个人目录的父目录(上一级目录):\n')
num=int(input('请输入用户名称再信息文件中的第几列(起始列为0)\n'))
for s in f:
clients=s.split(',')
name=clients[num]
os.mkdir(targetDir+'\\'+name)
print('生成客户个人目录结束,再见')
9.读入’ABC公司薪水-2035.txt’,找出其中本年度考核为优秀的员工,如果该员工的工龄超过三年,加薪50%,否则加薪30%。其他所有员工除总经理外一律加薪10%。总经理直接加薪50000。薪水四舍五入后统一保留整数位。此外,所有的员工的工龄和年龄也要加1
然后将调整后的信息写入’ABC公司薪水-2036txt’
提醒:该txt文档的第一行是信息头,如果处理?
ABC公司薪水_2035.txt
工号,姓名,职位,年龄,工龄,工资,考核结果
00001,曹恒,总经理,40,10,150000,优秀
00002,郑武,经理,34,8,18000,及格
00007,李飞,经理,30,7,13000,优秀
00019,张白,经理,28,6,14000,及格
00035,王柳,经理,34,4,19200,优秀
01002,张小明,职员,26,3,8000,及格
01004,李笑笑,职员,25,3,9000,优秀
01006,张三,职员,25,3,7000,优秀
01009,李四,职员,23,3,5000,及格
01013,王五,职员,21,1,6000,优秀
01015,郑六,职员,21,1,4000,及格
01016,宋七,职员,21,1,4800,优秀
#代码
with open('ABC公司薪水2035.txt','r',encoding='utf-8') as f:
lines=f.readlines() #读入文本
allStaffs=[]#此列表用于存放修改后的所有员工信息
for line in lines: #遍历文本的每一行
s=line.rstrip()#去掉文本每行末尾的换行符
curr=s.split(',')#将从文件中读入的当前数据进行用逗号做分解
#分解后得到的curr,六号位是考核结果
if len(curr)<=1:#有的行可能只有个换行符,去除后切割得到curr
continue#则跳过该行数据,回到循环首部进行下一行处理
if curr[0]=='工号':#如果是文件中的第一行抬头信息
allStaffs.append(s)#直接加到总列表去
continue #继续下一行的循环
#到了这里,说明这行是含有员工信息的有效行
old_GZ=int(curr[5])#员工当前旧工资
old_GL=int(curr[4])#员工当前旧工龄,转整形
curr[3]=str(int(curr[3])+1)#员工年龄为原有年龄+1
curr[4]=str(old_GL+1)#员工新工龄为原有+1,计算新工龄并存以字符串形式
#以下这段if语句用来处理工资,调整后的工资存在new_GZ变量中
if curr[2]=='总经理':#如果当前行是总经理,工资直接加五万
new_GZ=old_GZ+50000
else:
if curr[6]!='优秀':#如果考核结果不是优秀
new_GZ=round(old_GZ*1.1)#工资为原来的1.1倍
else:#到这里,说明该员工考核为优秀
if old_GL>=3:#如果原有工龄超过三年
new_GZ=round(old_GZ*1.5)#加薪50%
else:
new_GZ=round(old_GZ*1.3)#否则加薪30%
curr[5]=str(new_GZ)#调整当前行的员工新信息组成一个完整的字符串new_mess
new_mess=','.join(curr)#将curr中的员工新信息
allStaffs.append(new_mess)#将new_mess存储到总列表中
with open('ABC公司薪水2036.txt','w',encoding='utf-8') as f:
# 以写的方式生成工资新文件
# 下面的for语句,将allstaffs中存放的员工新信息写入该文件中
for i in allStaffs:
f.write(i + '\n')
print('处理完毕!')4
10.实现如下函数:
1)mergeFiles(sourceFiles,targetFile)
功能:新建targetFile文件,将sourceFiles列表中的每个元素指定的文件合并到targetFile文件中去,
例如:若sourceFiles=[‘a.txt’,’b.txt’,’c.txt’],targetFiles=‘hehe.txt’,那么本函数将合并a.txt、b.txt和c.txt这三个文件的内容到hehe.txt文件中去
2)toUpperCase(sourceFile,targetFile)
功能:新建targetFile文件,将souceFile文件内容转大写并保存在targetFile文件中
3)toLowerCase(sourceFile,targetFile)
功能:新建targetFile文件,将souceFile文件内容转小写并保存在targetFile文件中
#e.py
def mergeFiles(sourceFiles,targetFile):
#功能:将源文件列表中的文件内容全部依次赋值到目标文件中
#输入:sourceFiles:源文件列表,每个元素是一个源文件的文件美
#targetFile:目标文件
#输出:无
s=''
for filename in sourceFiles:
with open(filename) as f:
s+=f.read() #打开过列表的每一个文件读过存在s里面
with open(targetFile,'w',encoding='utf-8') as t:
t.write(s)
def toUpperCase(sourceFile,targetFile):
#功能:新建targetFile文件,将sourceFile文件内容转大写并保存在targetFile文件中
#输入:sourceFile为源文件名称,targetFile为目标文件名称
with open(sourceFile) as sf:
content=sf.read().upper()
with open(targetFile,'w',encoding='utf-8') as st:
st.write(content)
def toLowerCase(sourceFile,targetFile):
#功能:新建targetFile文件,将sourceFile文件内容转小写并保存在targetFile文件中
#输入:sourceFile为源文件名称,targetFile为目标文件名称
with open(sourceFile) as sf:
content=sf.read().lower()
with open(targetFile,'w',encoding='utf-8') as st:
st.write(content)
#只有函数定义,并未调用
11.import e
print('请进行文件操作选择:1.合并文件 2.文件转大写 3.文件转小写 4.退出程序' )
while (True):
i=int(input('请选择你的操作选择:非123则退出程序'))
if i ==1:
sF=input('请输入源文件列表,文件之间以Tab键分开: ')
sT=input('请为新目标文件命名: ')
sFlist=sF.split() #切割成列表,因为文件开始时以字符来的
e.mergeFiles(sFlist,sT)
elif i ==2:
sF = input('请输入源文件:')
sT = input('请为新目标文件命名: ')
e.toUpperCase(sF,sT)
elif i ==3:
sF = input('请输入源文件:')
sT = input('请为新目标文件命名: ')
e.toLowerCase(sF,sT)
else:
print('文件操作结束')
break