python基础知识(六)——文件

一.文件的操作介绍
(1)文件的打开与关闭
打开:用open函数打开一个已经存在文件或者创建一个新文件。
eg . f = open("python.txt ",‘w’)
文件的打开方式:
(ps . 要读取二进制文件,比如图片,视频等时,用‘rb’ , ‘wb’ 'ab’等模式打开)

r
*1. 读权限:yes
*2 . 写权限 no
*3 . 文件不存在,是否创建文件: no
*4 . 文件操作时是否清空内容: no
w
*1 . 读权限: no
*2 . 写权限: yes
*3 . 文件不存在时,是否会创建: yes
*4 . 文件操作时,是否会清空: yes
a
*1 . 读权限: no
*2 . 写权限: yes
*3 . 文件不存在时,是否会创建: yes
*4 . 文件操作时,是否会清空: no
w+
*1 . 读权限: yes
*2 . 写权限: yes
*3 . 文件不存在时,是否会创建: yes
*4 . 文件操作时,是否会清空 : yes
a+
*1 . 读权限: yes
*2 . 写权限: yes
*3 . 文件不存在时,是否会创建: yes
*4 . 文件操作时,是否会清空: no
r+
*1 . 读权限: yes
*2 . 写权限: yes
*3 . 文件不存在时,是否会创建: no
*4 . 文件操作时,是否会清空: no
eg .
在这里插入图片描述
实验结果如下:
在这里插入图片描述

对文件file 对象:
1)file.closed 如果文件关闭了,返回true,否则,返回False
2)file.mode 返回打开文件的访问模式。
3)file.name 返回文件的名称。
4)file.softspace 如果用print 输出,后面必须跟一个空格符,则返回False ,否则返回False .

file对象常用的方法:
1)读
read :读取指定字节,默认1024
readline : 读取文件中一行的内容
readlines:读取文件的所有内容,返回一个列表。
2)写
write:从指针所在的位置写入,写入的是字符串内容
writeliines:将列表中的每个元素都写入文件中。
3)定位
tell() 指针当前所在的位置
seek() 移动指针的位置
seek(ofset,from)—offset :偏移量,
from:0:表示文件开头,1:表示当前位置,2:表示文件末尾。

(2)文件的关闭
方法一:调用close() 方法关闭文件,文件使用后需要关闭,因为文件对象会占用操作及系统的资源,并且操作系统同一时间能打开的文件数量也是有限的。
方法二:python中引入了with语句来自动帮我们调用close() 方法
with open("/doc/file’/‘r’) as f:
print(f.read())
(python中with语句使用于对资源进行访问的场合,保证不管处理过程中是否发生错误或者异常都会自动执行规定的“清理”操作,释放被访问的资源,比如有文件读写后自动关闭,线程中锁的自动获取和释放。)
eg .在这里插入图片描述
实验结果如下:
在这里插入图片描述

(3)文件的备份
eg.将一个文件中的内容,拷贝到别的文件中。
代码如下:

import os
def copy(sorce_file, copy_file):
    """
    思路:以读的方式打开源文件,然后复制下来,之后一些的方式写进需要拷贝的文件中。完成拷贝工作。
    :param sorce_file: 源文件
    :param copy_file: 拷贝到的文件
    :return:
    """
    if os.path.exists(sorce_file):
        f = open(sorce_file)
        content = f.read()
        f.close()
        copy_f = open(copy_file, 'w')
        copy_f.write(content)
        copy_f.close()
        print("拷贝%s为%s成功" %(sorce_file, copy_file))
    else:
        print("拷贝%s不存在" %(sorce_file))

copy('doc/root', 'doc/passwd')

二. os模块

定义:语义为操作系统,处理操作系统相关功能,可跨平台。比如显示当前目录下所有文件或者删除某个文件或者获取文件大小。
eg. os a模块获取信息方法:

import os

# 1). 返回操作系统类型, 值为posix,是Linux操作系统, 值为nt, 是windows操作系统
print(os.name)
os_name = 'Linux' if os.name == 'posix' else 'Windows'
print("当前操作系统: %s" % (os_name))

# 2). 操作系统的详细信息
detail_info = os.uname()
print(detail_info)
print("主机名:", detail_info.nodename)
print("硬件架构:", detail_info.machine)
print("系统名称:", detail_info.sysname)
print("Linux内核的版本号:", detail_info.release)
# 3). 系统环境变量等价于Linux的env命令
print(os.environ)

# 4). 通过key值获取环境变量对应的value值
print(os.environ['PATH'])

路径:绝对路径和相对路径。

(1)os模块中的rename()可以完成对文件的重命名操作。
rename(需要修改的文件名,新的文件名)
(2)os模块中的remove()可以完成对文件的是删除操作 。
remove(待删除的文件名)
(3)os 模块中创建删除目录:
创建目录:os.mkdir() 。eg. os.mkdir(‘img’)
递归创建目录: mkdir -p
删除目录: os.rmdir(‘iimg’)
(4)os 模块创建删除文件
创建文件:os.mknod() 。 eg.os.mknod(‘root.txt’)

eg.文件批量创建。

import os
import random
import string


def generate_code(length=4):
    code_li = random.sample(string.ascii_lowercase, 1 + string.ascii_uppercase, 2 + string.digits, 1)
    # 将密码的组合顺序打乱
    random.shuffle(code_li)
    #将列表生成为字符串
    return "".join(code_li)


def create_file():
    dirname = 'img'
    if not os.path.exists(dirname):
        os.mkdir(dirname)
        print("目录%s创建成功" % (dirname))
    for count in range(10):
        filename = generate_code() + '.png'
        fullfile_name = os.path.join(dirname, filename)
        os.mknod(fullfile_name)
        print("%s创建成功" % (fullfile_name))


create_file()

批量修改后缀名:

import os

def add_ad(suffix):
     
 def modify_suffix(dirname, old_suffix, new_suffix):
    """
    'hello.png'  ----'hello.jpg'
    img .png .jpg
    :param dirname: 操作的目录
    :param old_suffix: 原先的后缀名
    :param new_suffix: 新的后缀名
    :return:
    """
    # 0-1).判断源后缀名是否以点开头, 如果不是,则添加;
    if not old_suffix.startswith('.'):
        old_suffix = '.' + old_suffix
    # 0-2). 判断新的后缀名是否以点开头, 如果不是,则添加;
    if not new_suffix.startswith('.'):
        new_suffix = '.' + new_suffix
    # 1. 判断查找的目录是否存在, 如果不存在, 显示报错
    if not os.path.exists(dirname):
        print("Error: 目录%s不存在" % (dirname))
    # 2. 如果文件存在,做如下操作:
    else:
        # 2-1). 列出指定目录的所有文件名;
        filenames = os.listdir(dirname)
        # 2-2). 依次遍历目录的每一个文件;
        for filename in filenames:
            # 2-3). 如果文件是以old_suffix结尾,则对改文件重命名;
            if filename.endswith(old_suffix):
                # 修改后缀名
                # 2-3-1). 将后缀名和文件名本身分隔开; hello.png === hello .png, 并生成新的文件名
                new_filename = os.path.splitext(filename)[0] + new_suffix
                full_old_filename = os.path.join(dirname, filename)
                full_new_filename = os.path.join(dirname, new_filename)
                # 2-3-2). 重命名
                os.rename(full_old_filename, full_new_filename)
                print("重命名【%s】 为【%s】成功!" % (filename, new_filename))


modify_suffix('img', '.jpg', '.png')

JSON模块:
定义: JSON是一种轻量级的数据交换格式。它是基于ECMAScript的一个子集。它是将各种语言进行相互转换(字典,元组,数值都可以,集合不行)
优势:易于人阅读和编写,同时也可以提高机器的解析和生成,(一般用于提升网络传输速率。)
eg
在这里插入图片描述
在这里插入图片描述

ps : 通用模块:
(1)ASCII :只能存储英文
(2)GB2312:不通用
(3)unicode:每个字都用两个字节存放,文件较大。
(4)utf-8:英文用一个字节存放,中文用三个字节存储JSON模块存储,保存的是字符串

JSON模块应用:将json转换成python模块。
代码如下:
在这里插入图片描述
运行结果如下:
在这里插入图片描述
将python 模块转换成json模块
代码如下:
在这里插入图片描述
运行结果如下:
在这里插入图片描述
数据类型编解码:
(1)json.dumps :将python对象编码成json字符串。
(ps.序列化及反序列化常用的参数:在这里插入图片描述
ensure_ascii=False :中文存储时需要设定
indent =4 增加缩进,增强可读性,但缩进空格会使数据变大
separators=(’,’,’;’) 自定义分隔符,元素分隔符为逗号,字典key和value值的分隔符为冒号。
sort_key =True :字典排序)

(2)json.dump: 将对象序列化并保存在文件中。
(3)json.loads:将已编码的JSON字符串解码成python对象。
(4)json.load: 将序列化字符串从文件中读取并反序列化。
在这里插入图片描述
在这里插入图片描述
运行结果为:
在这里插入图片描述

pickle模块:
python中的pickle 模块实现python的所有数据序列和反序列化。与JSON不同的是pickle不是用于语言间的数据传输,它仅作为python对象的持久化或者python程序间进行互相传输对象的方法。它支持python中所有的数据类型。
在这里插入图片描述

运行结果为:
在这里插入图片描述

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

实例一:读取一个文件,显示除了以#开头的行以外的所有行。
实验代码如下:
在这里插入图片描述
运行结果为:

在这里插入图片描述

实例二:制作一个密码薄,其可以存储一个网址(eg:www.csdn.net)和一个密码(eg.1234)请编写程序完成增删改查功能,并实现文件存储功能。

import os
def start():  # 定义主界面函数
    print("请选择需要的操作:")
    print("1.增加网址和密码")
    print("2.删除网址和密码")
    print("3.修改网址和密码")

def add_weblist():
#定义添加网址的函数:
    f = open("weblist.txt", 'w')
    web = input("请输入需要添加的网址:") + '\n'
    password = input("请输入密码:")
    f.write(web)
    f.write(password)
    f.close()

def del_weblist():
#删除网址的函数:
    weblist  = ""
    f = open("weblist.txt", 'r')
    web = input("请输入需要删除的网址:")
    password = input("请输入密码:")
    fr = f.read()
    f.close()
    if web in fr and password in fr:
        f1 = open("weblist.txt", 'w')
        f1.write(web)
        f1.close()
        print("删除成功")
    else:
        print("未找到对应网址或密码,请检查后重试")
        
def change_weblist():
#改变网址的函数:
    f = open("weblist.txt", 'r')
    web = input("请输入旧网址:")
    password = input("请输入旧密码:")
    fr = f.read()
    f.close()
    if web in fr and password in fr:
        f1 = open("weblist.txt", 'w')
        new_web = input("请输入新网址:") + '\n'
        new_password = input("请输入新密码:")
        f1.write(new_web)
        f1.write(new_password)
        f.close()
        print("更改成功")
    else:
        print("未找到对应网址或密码,请检查后重试")
        
#启动start()函数:
start()
while True:
    num = input("请输入操作指令:\n")
    num = int(num)
    if num == 1:
        add_weblist()
    elif num == 2:
        del_weblist()
    elif num == 3:
        change_weblist()

实例三:设置无重复字符的最长字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值