Python基础 -- 04 基础语法(文件操作、综合应用)

一、文件操作

1、文件的简单读写操作

"""
    写文件的操作:
            1.打开文件
            2.写入内容
            3.关闭文件

    打开文件的方法:open(fileName, operation)
                        fileName:要操作的文件名(字符串)
                        operation:要执行的操作,w代表写,r代表读(字符串)
                  该方法返回一个文件对象
"""
# 1. 打开helloworld.txt文件,并且要执行write操作
f = open("helloworld.txt","w")

# 2. 文件对象调用write()方法向文件中写入字符串
f.write("hello world!!! this is python")

# 3. 关闭文件,否则程序不结束内容无法写到文件中
f.close()       # close()方法将缓冲区的数据写入磁盘,并清空缓冲区



"""
    读文件的操作:
            1.打开文件
            2.读取内容
                read(num) : 读取指定字节数的文件内容,空参则读取所有文件内容
                readline : 读取一行数据
            3.关闭文件
"""
# 1.打开文件,设置操作为 r
f = open("helloworld.txt", "r")

# 2.读取文件内容,read(num),该方法如果传参,则表示读取多少个字符,如果不传参数,默认读取所有数据
text1 = f.readline()
text2 = f.read()
print(text1)
print(text2)

# 3.关闭文件
f.close()

2、文件的编码问题

"""
    文件的编码问题:
        问题引出:在项目下创建一个"笔记.txt"文件,在文件中存入中文
                 使用open最简单的方法打开文件,读取文件内容
                 此时,会报错如下:
                    Traceback (most recent call last):
                      File "D:/Python/Python-workspace/Day07/文件操作.py", line 11, in <module>
                        text = f.read();
                    UnicodeDecodeError: 'gbk' codec can't decode byte 0xa4 in position 16: illegal multibyte sequence
"""
# 1.代开文件
f = open("笔记.txt", "r")

# 2.读取文件内容
print(f.encoding)       # cp936 该行可以输出当前文件内容的编码格式
# text = f.read();      # 不修改编码,该行会报错

# 3.关闭文件
f.close()


"""
    解决编码问题:
        在打开文件的时候,设定文件的编码格式
            open(fileName, operation, encoding="编码集")
"""
# 1.打开文件
f = open("笔记.txt", "r", encoding="UTF-8")       # encoding="UTF-8"代表以utf-8的编码格式打开文件,同时将内容转码为uft-8格式

# 2.读取文件内容
print(f.encoding)       # UTF-8 该行可以输出当前文件内容的编码格式
text = f.read();
print(text)

# 3.关闭文件
f.close()

3、文件的权限


"""
    文件操作的权限:
        文件操作权限主要有:读数据(read)、写数据(write)、追加数据(append)

        r:读取文件:如果文件存在,则可以读取文件,如果文件不存在,则直接报错
            如果权限只有 r 的时候,是只能读,不能写。
                r : 文件的操作权限是只读  ⭐⭐⭐⭐⭐
                r+ : 文件的操作权限是可读可写   ⭐⭐⭐⭐⭐
                rb : 按照只读的模式打开二进制文件,例如音频、视频、图片等(b就是binary,二进制的意思)
                rb+ : 按照可读可写的方式打开二进制数据

        w:写入文件:如果文件存在,可以写入数据(但是会将之前文件的内容清空),如果文件不存在,会先创建文件,然后再写入数据
            如果权限只有 w 的时候,是只能写,不能读。
                w : 文件的操作权限是只写   ⭐⭐⭐⭐⭐
                w+ : 文件的操作权限是可读可写   ⭐⭐⭐⭐⭐
                wb : 按照只写的模式打开二进制文件,例如音频、视频、图片等(b就是binary,二进制的意思)
                wb+ : 按照可读可写的方式打开二进制数据

        a:追加数据:如果文件存在,则在文件末尾追加数据,如果文件不存在,则创建文件,然后写入数据
            a : 文件的操作权限是只能追加    ⭐⭐⭐⭐⭐
            a+ : 可读可写的追加文本数据
            ab : 按照只写的模式追加二进制文件,例如音频、视频、图片等(b就是binary,二进制的意思)
            ab+ : 按照可读可写的方式追加二进制数据
"""

# 1.写入文件
f = open("test.txt", "w", encoding="utf-8")
f.write("这是我的第一个python读写工程测试!!!!")
f.close()

# 2.读取文件内容
f = open("test.txt", "r", encoding="utf-8")
text = f.read()
print(text)             # 这是我的第一个python读写工程测试!!!!
f.close()

# 3.追加数据
f = open("test.txt", "a", encoding="utf-8")
f.write("我在test.txt下面追加数据。")
f.close()

# 4.读取追加过后的数据
f = open("test.txt", "r", encoding="utf-8")
text = f.read()
print(text)             # 这是我的第一个python读写工程测试!!!!我在test.txt下面追加数据。

4、文件的指针控制

"""
    文件指针:就相当于光标,即,指向当前文件操作开始的位置
        对文件进行任何的读写操作,都会修改文件指针的位置
        r 和 w 模式打开文件,指针都在文件的起始位置
        a 模式打开文件,指针默认在文件末尾

    tell() : 文件对象调用该方法,返回的是当前文件指针的读写位置,值是当前位置距离文件开头的字节数。

    seek(offset, whence) : 文件对象调用该方法,可以设置操作文件对象时的指针位置
        offset : 偏移量,即距离whence指定的位置的字节数 +数代表向右,-数代表向左
        whence : 设置偏移量的起始位置,取值有(0,1,2) 0:代表文件开头;1:代表当前文件指针的位置;2:代表文件结尾
"""

f = open("笔记.txt", "r+", encoding="UTF-8")

print(f.tell())         # 0  此时文件光标在开头位置,因此返回值为 0

print(f.readline())     # 这里面有很多的中文

# python中每个中文占3个字节,readline()方法一共读到9个汉字,然后指针指向下一行,多了一个换行符\r\n,换行符占用2个字节,所以结果是 29
print(f.tell())         # 29

f.seek(0)
print(f.tell())         # 使用seek()方法将指针重新指向文件开头,所以结果为 0

f.seek(5, 0)            # offset 为5, whence为0,表示从文件开头,向右移动5个字节,所以此时指针指向的位置是 5
print(f.tell())         # 5

f.close()

5、文件的读写函数

"""
    文件的读写函数:
"""


# 1.写的操作     write(str) :接收字符串参数,并从指针位置开始,向后覆盖内容
f = open("笔记.txt", "r+", encoding="utf-8")

f.write("\nnihaoshijie\n")      # \n代表换行

f.close()

# 2.读的操作:
#           read(num) :从文件指针位置开始,读取指定的字节数的内容,如果空参,则默认读取全部内容,并返回字符串
#           readline(num) : 从文件指针位置开始,向后读取一行内容,并返回字符串,readline()读完当前一行,默认将指针指向下一行开始。
#                           带参数是读取一行中指定的字节数的内容,如果字节数超出内容数,则忽略参数
#           readlines() : 读取文件内容,返回一个列表,列表的每个元素都是文件每行的内容
f = open("笔记.txt", "r+", encoding="utf-8")

f.read(10)
f.readline(1000)
f.readlines()

f.close()

6、文件缓冲区的处理

"""
    文件缓冲区的处理
        f.write()   :   将字符串写到缓冲区

        f.close()   :   将缓冲区的内容写入文件,并且将缓冲区清空,同时关闭文件

        f.flush()   :   将缓冲区的内容写入文件,但是不清空缓冲区内容

        f.read()    :   将内容读取到缓冲区

        time.sleep(10) :   文件对象暂停10秒再进行之后的操作
"""
import time

# ------------------------------------------------------------------------------

f = open("缓冲区处理.txt", "w+", encoding="utf-8")

f.write("python中缓冲区的处理")

f.close()       # 调用close方法,文件缓冲区清空,内容写到文件中,关闭文件


# ------------------------------------------------------------------------------
f2 = open("缓冲区处理.txt", "w+", encoding="utf-8")

f2.write("第二次操作缓冲区处理.txt文件,之后我要进行flush操作,然后再写一句话\n")

f2.flush()          # 执行完flush操作去查看文件,文件内容已经写入,此时缓冲区还是有内容

time.sleep(1)      # 让程序暂停十秒,以便去查看flush操作之后文件内容是否已经写入

f2.write("第一次查看文件时,没有这句话,close操作之后才有")

f2.close()


# ------------------------------------------------------------------------------
f3 = open("缓冲区处理.txt", "w+", encoding="utf-8")

f3.write("helloworld!!!")
f3.write("helloworld!!!")
f3.write("helloworld!!!")
f3.write("helloworld!!!")       # 写操作写完之后,指针位置在文件末尾

f3.flush()      # 将内容写入文件

f3.seek(0)

# read操作是从指针开始位置读取文件内容,如果没有将指针重新指向文件开头,则读取不到文件内容。有没有f3.seek(0),演示效果不一样
print(f3.read())


f3.close()

7、文件的信息处理

"""
    文件的信息处理
"""
f = open("笔记.txt", "r", encoding="utf-8")

# 查看文件编码
print(f.encoding)

# 查看文件名
print(f.name)

# 查看文件是否关闭,如果文件已经关闭,返回True,否则返回False
print(f.closed)

# 查看文件的读写权限
print(f.mode)

8、文件目录的操作处理

"""
    文件的路径:
        绝对路径:从磁盘根目录开始,到指定的文件的完整路径
        相对路径:相对于某个目录位置的路径,..表示上一级目录,.表示当前目录
"""
"""
    文件操作
"""
import os
f = open("笔记.txt", "r", encoding="utf-8")

# ⭐⭐⭐⭐⭐1.获取当前的文件所在文件夹的绝对路径
filePath = os.getcwd()
print(filePath)     # D:\Python\Python-workspace\Day07


# ⭐⭐⭐⭐⭐2.判断相对于当前文件所在的文件夹中是否存在某个指定的文件,返回的是布尔值
isHave = os.path.exists("文件操作.py")      # 参数也可以是带路径的文件名,表示从当前路径出发的相对路径
print(isHave)       # True
# 如果文件名是带路径的,可能会遇到转义字符,如:\r  \n等,在字符串最前面加上 r 即可表示对后面的带\的地方不做转义
print(os.path.exists(r"H:\360补丁\test\filelist.dat"))


# ⭐⭐⭐⭐⭐3.删除指定路径的文件
#os.remove("duxie.py")   # 删除当前路径下的文件
#os.remove(r"H:\360补丁\test\filelist.dat")        # 删除指定路径下的文件
# os.remove(r"..\Day06\a.txt")        # 删除当前路径上一级目录下的文件


# ⭐⭐⭐⭐⭐4.给指定文件重命名:os.rename(oldName, newName)
# os.rename("test.txt", "text.txt")

# ------------------------------------------------------------------------------------------------------

"""
    目录操作
"""
# 1. os.listdir(filePath) : 获取指定目录下的所有文件,返回一个列表,空参方法表示返回当前目录下的所有文件
fileList = os.listdir();
print(fileList)     # ['.idea', 'a.txt', 'duxie.txt', 'helloworld.txt', 'text.txt', '文件操作.py', '笔记.txt', '缓冲区处理.txt']

if "a.txt" in os.listdir():
    f = open("a.txt", "r", encoding="utf-8")
    print(f.read())
    f.close()

# ⭐⭐⭐⭐⭐2. os.mkdir(filePath) : 在指定目录下创建目录(文件夹),该方法一次只能创建一个目录,不能创建多级目录
os.mkdir(r"D:\test")

# 3. 创建多级目录使用 : os.makedirs(filePath)
os.makedirs(r"D:\ttext\aa\bb")

# 4. 删除指定目录 : os.rmdir(filePath),一次只能删除一个,并且只能是空目录
os.rmdir(r"D:\ttext\aa\bb")

# 5. 删除多级目录 : os.removedirs(filePath)
#os.removedirs(r"D:\ttext")

二、作业

1、备份任意格式的文件

"""
    创建任意文件的备份文件
"""
import os
# 1.获取当前路径下的所有文件列表
filePath = os.getcwd()      # 获取当前文件所在的目录的绝对位置
print(filePath)
fileList = os.listdir(filePath)        # 获取当前文件所在目录的文件列表
print(fileList)

# 2.输入要进行备份的文件名称
fileName = input("请输入要备份的文件名称(带后缀名):")

if fileName in fileList:
    # 要备份的文件在文件列表中存在,创建备份的文件名
    index = fileName.rfind(".")     # rfind(str) : 该方法用于从后向前寻找某个字符第一次出现的位置
    bakFileName = fileName[:index] + "_bak" + fileName[index:]

    # 3.开始进行备份
    # 打开原始文件和备份文件
    srcFile = open(fileName, "r")
    desFile = open(bakFileName, "w")

    # 如果使用read()的空参方法,如果文件内容过大,容易造成内存溢出
    # 如果使用readline()方法,如果文件内容过大且全在一行中,也容易造成内容溢出
    # 使用read(num) 方法,每次读取1M数据
    while True:
        line = srcFile.read(1024 * 1024)
        if len(line) != 0:
            desFile.write(line)
            desFile.flush()
        else:
            print("文件已经备份完毕!!!")
            break
    desFile.close()
    srcFile.close()

else:
    print("要备份的文件不存在!!!")

2、名片管理系统(将数据序列化到磁盘)



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值