11 文件

文件的打开与关闭

语法格式:open(’ 路径 ', ’ 打开模式 ') 此命令为创建或打开指定的文件存在即打开,不存在即创建
在这里插入图片描述
以下代码可能会因为编码格式的不同而出现乱码

#以默认的编码gbk为中文编码,在使用时最好指定一个编码类型
#打开文件
b=open('./test.text','w',encoding='utf-8')
#w模式每执行一次都会创建一个新文件而覆盖掉之前的文件
#读/写操作
b.write('圣诞节公布的健康的高考')
b.write('vbdvdfkbn')
b.close()


#以二进制的形式写数据(字节)
b=open('./test1.text','wb')
b.write('吧是单据福建大V比较的VB降低而'.encode('utf-8'))
b.close()



b=open('./test.text','a')#追加
b.write('吧是单据福建大V比较的VB降低而\r\n')
b.write('很丰富哈萨克')
b.close()

b=open('./test.text','ab')#以二进制追加
b.write('吧是单据福建大V比较的VB降低而\r\n'.encode('utf-8'))
b.write('很丰富哈萨克'.encode('utf-8'))
b.close()

读数据

读取文件内的数据

b=open('test.text','r')
print(b.read(20))#读取20个数据其中'\n','\r'分别为1个数据,不填数据则默认的为读取全部
print(b.read())#会从之前所读的位置往后读
print(b.readline(5))#表示读取该行,括号中的数字表示读取该行的前几个数据,其它性质与open一样
print(b.readlines())#读取所有行,括号中的数字表示读取第几行
b.close()

b=open('test.text','rb')#以二进制形式读取
data = b.read(20)
print(data.decode('gbk'))#解码
b.close()

读取内存中的数据

StringIO

只可以对字符串进行操作

from  io import StringIO
f = StringIO()
f.write("hcdhfk")
f.write(" ")
f.write("jjfd")
print('-------------------StringIO-------------------')
print(f.getvalue())
BytesIO

只可以对二进制数进行操作

from io import BytesIO
r = BytesIO()
r.write('东方今典'.encode('utf-8'))
print('-------------------BytesIO-------------------')
print(r.getvalue())

在这里插入图片描述

with的使用

可以自动释放关联的对象

with open('./test.text','a') as d:
    # print(d.read())
    d.write('vjdbjdvjdbvb')

文件备份

小文件备份

def copyFile():
    #接收用户输入的文件名
    old_file=input('输入文件名:')
    file_list=old_file.split('.')#分割文件名及其后缀
    #构造新的文件名.加上备份的后缀
    new_file=file_list[0] + '_01.' + file_list[1]
    old_f=open(old_file,'r')#打开需要备份的文件
    new_f=open(new_file,'w')#以写的模式去打开新文件,不存在则创建
    content = old_f.read()#将文件内容读取出来
    new_f.write(content)#将读取的内容写入到备份文件中
    old_f.close()
    new_f.close()
    pass
copyFile()

大文件备份

def copybigFile():
    #接收用户输入的文件名
    old_file=input('输入文件名:')
    file_list=old_file.split('.')#分割文件名及其后缀
    #构造新的文件名.加上备份的后缀
    new_file=file_list[0] + '_01.' + file_list[1]
    try:
        #监视处理逻辑
        with open(old_file,'r') as old_f,open(new_file,'w') as new_f:
            while True:
                content = old_f.read(1024)
                new_f.write(content)
                if len(content) <1024:
                    break
    except Exception as m:
        print(m)
    pass
copybigFile()

文件定位

tell

#文件定位
with open("test.text","r") as d:
    print(d.read(3))
    print(d.tell())#汉字占两个字节但当编码格式为“utf-8”时汉字占一个字节

truncate

with open("test.text","r") as d:
    print(d.read())
print("截取之后")
with open("test.text","r+") as f:
    print(f.truncate(10))
    print(f.read())

seek

seek(a,b)移动光标位置,a表示偏移的方向正数向前偏移,负数向后偏移,b表示偏移的起始位置 0表示文件开头 1表示当前位置 2表示文件末尾

with open("test.text","rb") as d:#r表示以字符形式读取,rb表示以字节形式读取
    d.seek(2,0)
    data = d.read(2)
    print(data.decode("gbk"))
    d.seek(-6,2)
    data = d.read(2)
    print(data.decode("gbk"))#\r\n各占一个字节
    d.seek(-2,1)
    data = d.read(1)
    print(data.decode("gbk"))

#'当我们采取使用字符形式读取时,则只可以用以文件开头来计算相对位置,而另外两种则不被允许

导入方式

import

import  time
print(time.ctime())

from … import

from time import ctime,time
print(ctime())

os模块操作文件

在这里插入图片描述

import os
import shutil
#重命名
 os.rename('./gjrg','gjrg.text') #('路径+旧名字','新名字')


#删除文件
 m = 'C:\\Users\\86183\\Documents\\Tencent Files\\3208236566\\FileRecv\\20210313_142332.mp4'#需要转义
 m = r'C:\Users\86183\Documents\Tencent Files\3208236566\FileRecv\ghgg.doc'
 os.remove(m)#('路径+名字')不会进入回收站,但可以通过选择撤销删除


print(os.path.split('C:/Users/86183/Desktop/python/test/1.py'))   #分割为路径和文件名

print(os.path.splitext('C:/Users/86183/Desktop/python/test/1.py'))#分割为路径和扩展名

#mkdir创建一级目录
 os.mkdir(r'C:\Users\86183\Desktop\b')
 os.mkdir('C:\\Users\\86183\\Desktop\\b\\m')#文件夹下创建文件夹需要分步进行(先创建外面的再创建里面的)


#删除文件夹(只能删除空目录)
 os.rmdir(r'C:\Users\86183\Desktop\b')##文件夹下删除文件夹需要分步进行(先删除里面的再创建外面的)
 makedirs允许创建多级目录
 os.makedirs('C:\\Users\\86183\\Desktop\\b\\m')
 os.makedirs('C:/Users/86183/Desktop/b/m')


#删除非空目录
 shutil.rmtree('C:/Users/86183/Desktop/a')


#获取当前文件路径
 print(os.getcwd())
 print(os.path.abspath('.'))


#路径的拼接
 print(os.path)
 print(os.path.join(os.getcwd(),'venv'))


#python中获取的目录列表(一级目录)
 m = os.listdir('C:/Users/86183/Desktop')
 for b in m:
     print(b)
#或者
 with os.scandir('C:/Users/86183/Desktop') as m:
     for n in m:
         # print(n)#两者不一样
         print(n.name)


# 判断文件类型
 m = 'C:/Users/86183/Desktop'
 for n in os.listdir(m):
     if os.path.isfile(os.path.join(m,n)):
         print(n)
 print("----------------------")
 for n in os.listdir(m):
     if os.path.isdir(os.path.join(m,n)):
         print(n)
#列出当前目录下的所有目录
print([x for x in os.listdir('.') if os.path.isdir(x)])
#列出当前目录下的所有.py文件
print([x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1] == '.py'])

#遍历路径下的所有文件
def ff(m):
    for n in os.listdir(m):
        d = os.path.join(m,n)#表示该路径下各个一级目录的路径
        if os.path.isdir(d):
            ff(d)
        else:
            print(d)
    pass
c = 'C:/Users/86183/Desktop'
ff(c)

模块的制作

在python中一个.py文件就是一个模块
不同的模块可以定义相同的变量名,但每个模块变量名的作用域只作用于本模块中
模块分类:
内置模块 自定义模块 第三方模块
在这里插入图片描述

import fsfsd#为之前写好的.py文件
c = fsfsd.add(5,9)
g = fsfsd.d(5,9)
k = fsfsd.d(9,5)
print(c) #其实整个过程就相当于在当前文件中去调用之前写好的文件
print(g)
print(k)
from fsfsd import add
c = add(5,9)

from fsfsd import *
# 使用此种方法进行导入时只可以导入__all__魔术变量中有的变量
c = add(5,9)
g = d(5,9)
k = d(9,5)
print(c)
print(g)
print(k)
import os
#
info_message = """zhangyang 100000
weo 80000
link 50000
flyDemo 30000
"""  #将信息一行一行输出
#序列字典
xulie_dict = {}
#工资字典
gongzi_dict = {}
#本地创建的文件名
file_name = "info.txt"
#创建文件的路径
Path = os.getcwd()
os.chdir(Path)
# 创建文件函数
def flush_info_txt(file_name, info=info_message):
    with open(file_name, "wt", encoding="utf8") as f:
        f.write(info + "\n")
#追加新用户信息使用函数
def add_info_txt(file_name, info=None):
    with open(file_name, "a+", encoding="utf8") as f:
        f.writelines(info)#将添加的信息像之前一样一行一行的添加
#读取用户和工资信息函数
def read_file_txt(file_name):
    with open(file_name) as f:
        f = f.read()
    return f
#将读取出来的姓名和工资形成字典对应
def info_user():
    with open(file_name,encoding='utf8') as f:
        # file = f.read().strip().split()#strip函数用于去除字符串首尾的内容,但对中间的不做处理   split拆分字符串m并构成字典
        file = f.read().split()
        keys = [x for x in range(len(file)) if x % 2 == 0]
        value = [x for x in range(len(file)) if x % 2 == 1]
        for x, y in zip(keys,value):
            gongzi_dict[file[x]] = file[y]
    return gongzi_dict
#检测初始文件是否存在。不存在就创建,存在就忽略
def check_file():
    if not os.path.exists(file_name):
        flush_info_txt(file_name)
    else:
        pass
check_file()
#检测输入是否合理
def check_error(shuru):
    if len(shuru) == 0:
        print("您输入的为空,请检查输入!")
    elif str(shuru).isdigit() == False :
        print("输入了错误的字符,请输入数字")
    else:
        return True
#检测输入的用户名是否在字典的keys中
def check_user(shuru):
    if shuru not in gongzi_dict.keys():
        pass
    elif len(shuru) == 0 or int(len(shuru)) > 6:
        print("用户姓名输入错误!不符合姓名的格式.超过6个字段.")
    else:
        print("您输入的用户出现冲突,用户姓名必须唯一,请核对该用户的信息")
choice_exit = True
def check_choice(choice):
    if (len(choice) != 0) and (int(choice) in list_num):
        for i, q in enumerate(list_choice):
            xulie_dict[i+1] = q

        for key, value in xulie_dict.items():
            if int(choice) == 4:
                print("......程序正在退出..........")
                exit(2)

            elif int(choice) == key:
                    input_user_name = input("您选择的是:({}),请输入想要{}的员工姓名:".format(key, value[0:2]))
                    dict_name = info_user()
                    if input_user_name in dict_name.keys():
                        if key == 1:
                            print("{}的工资是:{}\n******************************".format(input_user_name,dict_name[input_user_name]))
                            break

                        elif key == 2:
                            dict_name = info_user()
                            old_gongzi = dict_name[input_user_name]
                            # print(old_gongzi)
                            update_gongzi = input("请输入修改后的工资金额:")
                            check_error(update_gongzi)
                            dict_name[input_user_name] = update_gongzi
                            update_gongzi = dict_name[input_user_name]
                            str_info = read_file_txt(file_name)
                            str_info = str_info.replace(old_gongzi, update_gongzi)
                            # print(str_info)
                            flush_info_txt(file_name, info=str_info)
                            print("修改成功!")


                        else:
                            pass


                    elif key ==3:
                        new_gongzi = input("请输入他的工资: ")
                        check_user(input_user_name)
                        new_user_info = str(input_user_name) + " " + new_gongzi
                        add_info_txt(file_name, new_user_info)
                        print("新用户增加成功")
                    else:
                        print("您输入的用户名不存在,请检查后重新输入!")
                        break

    else:
        print("您输入了错误的数字,请检查重新输入是否在{}范围内".format(list_num))


while choice_exit:
    list_choice = ["查询员工工资", "修改员工工资", "增加新员工记录", "退出"]
    for i, q in enumerate(list_choice):
        print(str(i+1) + "." + str(q))

    list_num = [x+1 for x in range(len(list_choice))]

    input_number = input(">>>>请输入您要进行的操作: ")
    if str(input_number).isdigit():
        check_choice(input_number)
    else:
        check_error(input_number)
        continue
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值