08 Python文件

2023-12-14 08:46:34

1.文件编码

  • 文件分类(了解):

    • 文本文件:专门存储文本字符数据。比如:txt,ppt,Excel等
    • 二进制文件:不能直接使用文字处理程序正常读写,必须先了解其结构和序列化规则,再设计正确的反序列化规则,才能正确获取文件信息。比如:可执行程序exe
  • 文件存储格式:
    image-20231210214004198

  • 什么是文件编码?

    • 按照一定规则,把逻辑上的内容转换成01形式的机器语言
  • 有哪些文件编码?

    • UTF-8
    • ASCII,GBK,big5
  • 什么是文件编码?

    • 按照一定规则,把逻辑上的内容转换成01形式的机器语言
  • 有哪些文件编码?

    • UTF-8
    • ASCII,GBK,big5

1.2 文件的读取

  • 文件操作步骤:
    1. 打开文件
    2. 操作文件-读、写
    3. 关闭文件
  • open(file_name,mode,encoding=“UTF-8”)
    • 参数:name,
    • 访问模式
      • 主访问模式:(r,w,a),还有两种配合模式r和+
      • 使用”r”模式,读操作注意:
        • 文件如果不存在,会报错
    • 编码encoding=“UTF-8”
  • read()
    • 带字节
    • 不带字节参数
    • 注意光标位置
    • 注意"\n"
  • readline()-一行
  • readlines()–一行都是列表中的一个元素
  • for line in 文件对象
    • 要掌握
  • 文件对象.close()
    • 对比不关闭,文件被占用

    • 使用sleep睡眠方法

  • with open 方法避免遗忘关闭
"""
演示对文件的读取
"""

# 打开文件
import time

f = open("D:/测试.txt", "r", encoding="UTF-8")
print(type(f))
# 读取文件 - read()
# print(f"读取10个字节的结果:{f.read(10)}")
# print(f"read方法读取全部内容的结果是:{f.read()}")
print("-----------------------------------------------")
# 读取文件 - readLines()
# lines = f.readlines()   # 读取文件的全部行,封装到列表中
# print(f"lines对象的类型:{type(lines)}")
# print(f"lines对象的内容是:{lines}")

# 读取文件 - readline()
# line1 = f.readline()
# line2 = f.readline()
# line3 = f.readline()
# print(f"第一行数据是:{line1}")
# print(f"第二行数据是:{line2}")
# print(f"第三行数据是:{line3}")

# for循环读取文件行
# for line in f:
#     print(f"每一行数据是:{line}")
# # 文件的关闭
# f.close()
# time.sleep(500000)
# with open 语法操作文件
with open("D:/测试.txt", "r", encoding="UTF-8") as f:
    for line in f:
        print(f"每一行数据是:{line}")

time.sleep(500000)
  • 练习-读取文件的4种方式:

    #1 打开文件
    fr = open("H:\\test.txt", "r", encoding="utf-8")
    #方法1:read()
    # print(f"读取之前的光标位置:{fr.tell()}")
    print(fr.read())
    # print(f"读取之后的光标位置:{fr.tell()}")
    print("----------------")
    fr.seek(0, 0)#移动光标到文件开头
    #方法2:readline()
    for i in range(1, 6):
        print(fr.readline(), end="")
    print("\n----------------")
    
    fr.seek(0, 0)#移动光标到文件开头
    #方法3:readlines()
    for i in fr.readlines():
        # print(type(i))
        #strip()去掉字符串两端空格,和\n
        print(i.strip())
    
    print("----------------")
    fr.seek(0, 0)#移动光标到文件开头
    #方法4:
    for line in fr:
        print(line,end="")
    #3 关闭文件
    fr.close()
    
  • 课后练习-单词计数:

    • 通过Windows的文本编辑器软件,将如下内容,复制并保存到:word.txt,文件可以存储在任意位置,通过文件读取操作,读取此文件,统计dashuju单词出现的次数
dashuju itcast python
dashuju python itcast
beijing shanghai dashuju
shenzhen guangzhou dashuju
wuhan hangzhou dashuju
zhengzhou bigdata dashuju
  • 代码
#通过文件读取操作,读取此文件,统计dashuju单词出现的次数
#1 打开文件
fr = open("H:\\01-财税22、23年秋课程资料\\02-Python程序设计\\09 课上练习\\1班\\第7章\\word.txt","r+",encoding="utf-8")
#2 读取并统计
# 方法一:
# content = fr.read()
# # print(f"类型:{type(fr.read())}")
# print("数量有:",content.count("dashuju"))
#方法二:
# print(fr.readline())
count = 0
for i in fr:
    #1 使用strip()对i去掉前后空格,以及换行符,
    # print("strip后:",i.strip())
    line_list = i.strip().split(" ")
    for j in line_list:
        if j == "dashuju":
            count = count + 1
#3 关闭
print(f"dashuju单词数量为:{count}")
fr.close()

1.3 文件的写入

  • 使用方法:

    • "w"模式
    • write()
    • flush()
  • 案例:

    • 注意:直接调用write,内容并未真正写入文件,而是会积攒在程序的内存中,称之为缓冲区
    • 当调用flush的时候,内容会真正写入文件这样做是避免频繁的操作硬盘,导致效率下降(攒一堆,一次性写磁盘)
# 1. 打开文件
f = open('python.txt', 'w')

# 2.文件写入
f.write('hello world')

# 3. 内容刷新
f.flush()
  • 使用”w”模式,写操作注意:
    • 文件如果不存在,会创建新文件文件如果存在,
    • 文件如果不存在,会将原有内容清空
  • close,自带flush() 方法的功能

1.4 文件的追加文件

  • 所有方法类似写入操作,类比写入记忆

    • 注意事项:此模式下,文件指针在最后,无法读取数据
  • 案例演示:

    • a模式,文件不存在,会创建文件
    • a模式,文件存在,会在最后,追加写入文件
# 1. 打开文件,通过a模式打开即可
f = open('python.txt', 'a')

# 2.文件写入
f.write('hello world')

# 3. 内容刷新
f.flush()
  • 演示练习:
import time
#1
fa = open("test1.txt", "a+", encoding="utf-8")
#2 
fa.write("\n22222这是追加的内容")
time.sleep(5)
fa.flush()
#3 
fa.close()

1.5 操作综合案例

  • 文件备份

需求:有一份账单文件,记录了消费收入的具体记录,内容如下:

name,date,money,type,remarks
周杰轮,2022-01-01,100000,消费,正式
周杰轮,2022-01-02,300000,收入,正式
周杰轮,2022-01-03,100000,消费,测试
林俊节,2022-01-01,300000,收入,正式
林俊节,2022-01-02,100000,消费,测试
林俊节,2022-01-03,100000,消费,正式
林俊节,2022-01-04,100000,消费,测试
林俊节,2022-01-05,500000,收入,正式
张学油,2022-01-01,100000,消费,正式
张学油,2022-01-02,500000,收入,正式
张学油,2022-01-03,900000,收入,测试
王力鸿,2022-01-01,500000,消费,正式
王力鸿,2022-01-02,300000,消费,测试
王力鸿,2022-01-03,950000,收入,正式
刘德滑,2022-01-01,300000,消费,测试
刘德滑,2022-01-02,100000,消费,正式
刘德滑,2022-01-03,300000,消费,正式

同学们可以将内容复制并保存为 bill.txt文件,
我们现在要做的就是:

  • 读取文件
  • 将文件写出到bill.txt.bak文件作为备份
  • 同时,将文件内标记为测试的数据行丢弃
实现思路:
open和r模式打开一个文件对象,并读取文件
open和w模式打开另一个文件对象,用于文件写出
for循环内容,判断是否是测试不是测试就write写出,是测试就continue跳过
将2个文件对象均close()

1.6 补充

文件读写模式补充

  • 补充二进制
打开模式名称描述
r/rb只读模式以只读的形式打开文本文件/二进制文件,若文件不存在或无法找到,文件打开失败
w/wb只写模式以只写的形式打开文本文件/二进制文件,若文件已存在,则重写文件,否则创建新文件
a/ab追加模式以只写的形式打开文本文件/二进制文件,只允许在该文件末尾追加数据,若文件不存在,则创建新文件
r+/rb+读取(更新)模式以读/写的形式打开文本文件/二进制文件,若文件不存在,文件打开失败
w+/wb+写入(更新)模式以读/写的形式打开文本文件/二进制文件,若文件已存在,则重写文件
a+/ab+追加(更新)模式以读/写的形式打开文本/二进制文件,只允许在文件末尾添加数据,若文件不存在,则创建新文件

文件的定位读写

  • Python提供了一些获取与修改文件读写位置的方法,以实现文件的定位读写。

    • tell():获取文件当前的读写位置。

      with open('file.txt') as f:
          print(f.tell())					# 获取文件读写位置
          print(f.read(5))				# 利用read()方法移动文件读写位置
          print(f.tell())					# 再次获取文件读写位置
      
    • seek():控制文件的读写位置,seek()方法调用成功后会返回当前读写位置。

    • 语法格式如下:

      • seek(offset, from)

        • seek(0,0) 等价seek(0)

        • offset:表示偏移量,即读写位置需要移动的字节数。

        • from:用于指定文件的读写位置,该参数的取值为0、1、2。

          0:表示文件开头。

          1:表示使用当前读写位置。

          2:表示文件末尾。

      with open('file.txt') as f:
          print(f.tell())					# 获取文件读写位置
          print(f.read(5))				# 利用read()方法移动文件读写位置
          print(f.tell())					# 再次获取文件读写位置
      
      #在Python3中,若打开的是文本文件,那么seek()方法只允许相对于文件开头移动文件位置,若在参数from值为1、2的情况下对文本文件进行位移操作,将会产生错误。
      with open('file.txt') as f:
          f.seek(5,0)						# 相对文件开头移动5字节
          f.seek(3,1)
      

2. 文件与目录管理

  • 概念:os模块中定义了与文件操作相关的函数,利用这些函数可以实现删除文件、文件重命名、创建/删除目录、获取当前目录、更改默认目录与获取目录列表等操作。

    • 删除文件——os.remove(文件名)

    • 文件重命名——os.rename(原文件名,新文件名)

    • 创建/删除目录——os.mkdir(目录名)/os.rmdir(目录名)

    • 获取当前目录——os.getcwd()

    • 更改默认目录——os.chdir(路径名)

    • 获取目录列表——os.listdir(目录/路径)

  • 练习1:文件备份

    需求:?户输?当前?录下任意?件名,程序完成对该?件的备份功能(备份?件名为xx[备份]后缀,例
    如:test[备份].txt)。

    • 步骤

      1. 接收?户输?的?件名
      2. 规划备份?件名
      3. 备份?件写?数据
    • 代码实现:

      1. 接收?户输?的?件名
      old_name = input('请输?您要备份的?件名:')
      
      2. 规划备份?件名
      
      2.1 提取?标?件后缀
      
      2.2 组织备份的?件名,xx[备份]后缀
      
      ```python
      # 2.1 提取?件后缀点的下标
      index = old_name.rfind('.')
      # print(index) # 后缀中.的下标
      # print(old_name[:index]) # 源?件名(?后缀)
      # 2.2 组织新?件名 旧?件名 + [备份] + 后缀
      new_name = old_name[:index] + '[备份]' + old_name[index:]
      # 打印新?件名(带后缀)
      # print(new_name)
      
      1. 备份?件写?数据

        3.1 打开源?件 和 备份?件

        3.2 将源?件数据写?备份?件

        3.3 关闭?件

      #3 备份文件写入数据
      #3.1 打开源文件和备份文件
      fr_old = open(old_f, "r", encoding="utf-8")
      fw_new = open(new_f, "w+", encoding="utf-8")
      #3.2 写入新文件
      while True:
         con = fr_old.read(1024)
         if len(con) == 0:
             break
         else:
             fw_new.write(con)
      #3.3关闭文件
      fr_old.close()
      fw_new.close()
      
      

练习2:文件批量改名:

  • 添加或删除指定字符串->“Python_原文件名”

文章来源:https://blog.csdn.net/aj_shang/article/details/134914187
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。