3.OS(operate system)(简化)操作系统模块,目录和文本文件

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


image.png

当前路径,绝对路径(有盘符),上级目录(..或者.),相对路径

关于上下文管理语句with

实际开发中,读写文件应优先考虑使用上下文管理语句with,关键字with可以自动管理资源,不论因为什么原因(哪怕代码异常)跳出with块时,总能保证文件被正常关闭,可以在代码块执行完毕后自动还原到进入该代码块时的上下文,常用于文件操作、数据库连接、网络通信连接等场合。

用于文件时语法如下: with open(filename, mode, encoding) as fp: #底下是操作fp的语句

例如: 
with open(’abc.txt’) as f: 
    s=f.read()
image.png

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)根据用户信息文件创建所有客户目录


image.png
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.
image.png
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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345