python基础教学day06-文件操作

本文围绕Python持续化储存文件操作展开。介绍了open函数的文件打开模式、File对象属性和方法;阐述了os模块处理操作系统相关功能,如路径操作、文件和目录的创建删除等;还讲解了json和pickle模块的数据序列化与反序列化,最后给出多个操作示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要内容:持续化储存文件操作

一、文件操作介绍

1、在python中使用open函数,可以打开一个已经存在的文件,或者创建一个新的文件。
格式:open(文件名,访问模式) e.g.f = open(test.txt,‘w’)
如果文件不存在那么先清空,然后在写入数据
2、
r:有读权限、没有写的权限、文件不存在不会创建文件、文件操作不会清空文件
w:没有读取权限、有写权限、文件不存在会创建文件、文件操作会清空文件
a:没有读的权限、有写的权限、文件不存在会创建文件、文件操作不会清空文件
r+:有读的权限、有写的权限、文件不存在不会创建文件、文件操作不会清空文件
w+:有读的权限、有写的权限、文件不存在会创建文件、文件操作会清空文件
a+:有读的权限、有写的权限、文件不存在会创建文件、文件操作不会清空文件
3、File对象的属性
file.closed :如果文件关闭返回True、否则返回False
file.mode:返回打开文件的访问模式
file.name:返回文件的名称
file.softspace:如果print输出后,必须返回一个空格符,则返回False,否则返回True
4、File对象的常用方法:
:{read:读取指定字节,默认1024;readline:读取文件的一行内容;readlines:读取文件所有内容返回一个列表}
:{write:从指针所在位置写入,写入是字符内容;writelines:将列表的每个元素写入文件}
定位:{tell:指针当前所在位置;seek:移动指针位置}
5、seek(offset,from)有2个参数:
offset:偏移量
from:方向,0:表示文件开头;1:表示文件当前位置;2:表示文件末尾位置
6、文件的关闭
1)调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象占用操作系统的资源,并且操作系统同一时间打开的文件数量也是有限的;
2)也可以使用with语句来自动帮我们调用close()方法:
格式:with open(‘doc/passwd’,‘r’) as f:

二、 os 模块

1、os,语义定义为操作系统,处理操作系统相关的功能,可跨平台

import os
#1)返回操作系统类型,值为posix,是linux,值为nt,为windows操作系统
print(os.name)
print('Linux' if os.name == 'posix' else 'Windows')

#2)操作系统的详细信息
# info = os.uname()
# print(info)
# print(info.sysname)
# print(info.nodename)
#Windows下uname不能使用
#3)通过key值获取环境变量对应的value值
print(os.environ.get('PATH'))
print(os.getenv("PATH"))

2、关于路径
#1判断是否为绝对路径—‘/tmp/hello’,‘hello.png’
print(os.path.isabs(’/tmp/hello’))
print(os.path.isabs(‘hello.png’))

#2 生成绝对路径
print(os.path.abspath(’/tmp/hello’))
print(os.path.abspath(‘hello’)

#3’hello.png’
print(os.path.join(’/home/kiosk’,‘hello.png’))

#4获取目录名或者文件名
filename = ‘/doc/passwd.png’
print(os.path.basename(filename))
print(os.path.dirname(filename))

#5创建目录/删除目录
os.makedirs()
os.mkdir(‘img’)
os.rmdir(‘img’)

#6创建文件/删除文件
os.mknod(‘00_ok.txt’)
os.remove(‘00_ok.txt’)

#7文件重命名
os.rename(‘data.txt’,‘data1.txt’)

#8判断文件或者目录是否存在
print(os.path.exists(‘img’))

#9分离后缀名和文件名
print(os.path.spiltext(‘hello.png’))
print(os.path.spilt(‘hello.png’))

#10 将目录名和文件名分离
print(os.path.spilt(’/tmp/hello.png’))

三、json模块

1、JSON是一种轻量级的数据交换式,它基于ECMAScript的一个子集。JSON完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯
2、dump:将对象序列化并保存文件
load:将序列化字符串从文件读取并反序列化
格式:json.dumps:(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
allow_nan=True, cls=None, indent=None, separators=None,
encoding=“utf-8”, default=None, sort_keys=False, **kw)
ensure_ascii=True:中文存储需要设定。
indent=4:增加缩进,增强可读性,但缩进空格会使数据变大。
separators=(’,’,’:’): 自定义分隔符,元素间分隔符为逗号, 字典key和value值的分隔符为冒号。
sort_keys=True: 字典排序

四、pickle模块

1、JSON只能处理基本数据类型。pickle能处理所有python的数据类型。
2、JSON用于各种语言之间的字符转换。pickle用于python程序对象的持久化或者python程序间对象网络传输,但不同版本的python序列化可能还有差异。、

例一:

批量修改文件名

import os
funFlag = 2
foldName = 'doc/'
dirlist = os.listdir(foldName)
for i in dirlist:
    if funFlag == 1:
        newName = '[西部开源]'+ i
    elif funFlag == 2:
        num = len('[西部开源]')
        newName = i[num:]
    print('重命名%s为%s成功'%(i,newName))
    os.rename(foldName + i,foldName + newName)

例二:

1、读取一个文件,显示除了以井号(#)开头的行以外的所有行。

#打开文件
f = open('doc/group','a+')
#将指针移动至开头
f.seek(0,0)
print(f.tell())
list_in = []
list_notin = []
for i in range(6):
    list_read = f.readline()
    if '#' not in list_read:
        list_in.append(list_read)
    else:
        list_notin.append(list_read)
print('不带#好的有:',list_in)
print('带#号的有:',list_notin)
list_in_str = str(list_in)
with open('doc/group1','w') as f:
    f.write(list_in_str)

例三:

2、制作一个"密码薄",其可以存储一个网址(例如 www.youkuaiyun.com),和一个密码(例如 123456),请编写程序完成这个“密码薄”的增删改查功能,并且实现文件存储功能。

def file():
    dict = {}
    while True:
        i = int(input('请输入要进行的操作 0-->退出 1-->增加;2-->删除;3-->显示;4-->修改:'))
        if i == 1:
            website = input('请输入要存储的网站:')
            passworld = int(input('请输入密码:'))
            dict[website] = passworld
        elif i == 2:
            website_del = input('请输入要删除的网站:')
            del dict[website_del]
        elif i == 3:
            print(dict)
        elif i == 4:
            amend_info = input('请输入要修改信息的网站:')
            if amend_info in dict.keys():
                amend_i = int(input('您是否要修改网站;11-->修改,12-->不修改:'))
                if amend_i == 11:
                    value_old = dict.setdefault(amend_info)
                    del dict[amend_info]
                    new_web = input('请输入新的网站:')
                    dict[new_web] = value_old
                    amend_j = int(input('您是否要修改密码;21-->修改,22-->不修改:'))
                    if amend_j == 21:
                        del dict[amend_info]
                        new_key = input('请输入修改后的密码:')
                        dict[amend_info] = new_key
                    elif amend_j == 22:
                        pass
                elif amend_i == 12:
                    pass
            else:
                print('您输入的网站不存在!')
        else:
            break
    with open('info', 'w') as f:
        f.write('%s\n'%dict)
    f.close()
file()

例四:

  1. 学生管理系统(文件版)
    1). 必须使用自定义函数,完成对程序的模块化
    2). 学生信息至少包含:姓名、年龄、学号,除此以外可以适当添加
    3). 必须完成的功能:添加、删除、修改、查询、退出
def student():
    print("-" * 30)
    print("     学生管理系统 ")
    print(" 1.添加学生的信息")
    print(" 2.删除学生的信息")
    print(" 3.修改学生的信息")
    print(" 4.查询学生的信息")
    print(' 5.遍历所有学生的信息')
    print(" 6.退出系统")
    print('-' * 30)

students = []

while True:
    #对用户呈现选择栏
    student()
    key = int(input('请输入要进行的操作:'))
    if key == 1:
        print('您选择了学生信息的添加')
        stuname = input('请输入学生的姓名')
        stuid = input('请输入学生的学号')
        stuage = input('请输入学生的年龄')
        #定义一个字典用来存放学生信息
        stuInfo = {}
        stuInfo['name'] = stuname
        stuInfo['id'] = stuid
        stuInfo['age'] = stuage
        students.append(stuInfo)
    elif key == 2:
        print('您选择了学生信息的删除')
        del_student = input('请输入要删除学生学号:')
        i = 0
        leap = 0
        for temp in students:
            if temp['id'] == del_student:
                leap = 1
                break
            else:
                i += 1
        if leap == 0:
            print('没有这个学生')
        else:
            del students[i]
            print('删除成功!')

    elif key == 3:
        print('那您选择的是学生信息的修改')
        alterid = input('请输入要修改的学生的学号:')
        i = 0
        leap = 0
        for temp in students:
            if temp['id'] == alterid:
                leap = 1
                break
            else:
                i += 1
        if leap == 1:
            while True:
                alterNum = int(input('请选择您要修改的项目1-->name,2-->id,3-->age  '))
                if alterNum == 1:
                    newname = input('输入要修改后的name:')
                    i = 0
                    leap1 = 0
                    for item in students:
                        if item['name'] == newname:
                            leap1 = 1
                            break
                        else:
                            i += 1
                        if  leap1 == 1:
                            print('姓名重复修改失败!')
                        else:
                            item['name'] = newname
                    break

                elif alterNum == 2:
                    newid = input('输入要修改后的id:')
                    i = 0
                    leap2 = 0
                    for item in students:
                        if item['id'] == newid:
                            leap2 = 1
                            break
                        else:
                            i += 1
                        if leap2 == 1:
                            print('学号重复修改失败!')
                        else:
                            item['id'] = newid
                    break
                else:
                    newage= input('输入要修改后的age:')
                    i = 0
                    leap3 = 0
                    for item in students:
                        if item['age'] == newage:
                            leap3 = 1
                            break
                        else:
                            i += 1
                        if leap3 == 0:
                            print('数据重复修改失败!')
                        else:
                            item['age'] = newage
                    break
        else:
            print('此学生不存在!')
    elif key == 4:
        print('您选择了学生信息的查询')
        fun_student = input('请输入要查询学生学号:')
        i = 0
        leap = 0
        for temp in students:
            if temp['id'] == fun_student:
                leap = 1
                break
            else:
                i += 1
        if leap == 0:
            print('没有这个学生')
        else:
            print('查询学生信息如下:%s  %s  %s'%(temp['name'],temp['id'],temp['age']))
            print('查询成功!')

    elif key == 5:
        print('学生信息如下')
        print('name   id   age')
        for temp in students:
            print('%s   %s  %s'%(temp['name'],temp['id'],temp['age']))
        print('*'* 20)



    elif key == 6:
        print('谢谢使用学生管理系统')
        break
with open('info_high', 'w') as f:
    f.write('%s\n'%students)
f.close()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值