当前位置:   article > 正文

Python-Level2-day03:文件读写操作,文件缓冲区与偏移量,os模块_python读level2

python读level2

数据管理

  • 数据处理概述

    数据处理的基本目的是从大量的、可能是杂乱无章的、难以理解的数据中抽取并推导出对于某些特定的人们来说是有价值、有意义的数据。当下数据处理贯穿于社会生产和社会生活的各个领域。数据处理技术的发展及其应用的广度和深度,极大地影响了人类社会发展的进程。数据处理也是大数据,数据分析等后续学科的基本环节。70709a346e32462cbb140f3d57634a5a.png

  • 基本概念

    • 数据 : 能够输入到计算机中并被识别处理的信息集合。

  • 数据存储阶段

    • 人工管理阶段:人为管理,没有固定的格式和存储方法,容易混乱。

    • 文件管理阶段 :数据可以长期保存,存储数据量大,使用简单。

    • 数据库管理阶段:高效,可以存储更大量数据,便于管理,更加专业。

1. 文件处理

1.1 引入

  • 什么是文件

    文件是保存在持久化存储设备(硬盘、U盘、光盘..)上的一段数据,一个文本,一个py文件,一张图片,视频音频等这些都是文件。

  • 文件分类

    • 文本文件:打开后会自动解码为字符,如txt文件,word文件,py程序文件。

    • 二进制文件:内部编码为二进制码,无法通过文字编码解析,如压缩包,音频,视频,图片等。必须通过专门的解码软件进行打开。

  • 字节串类型

    • 概念 : 在python3中引入了字节串的概念,与str不同,字节串以字节序列值表达数据,更方便用来处理二进制数据。(就是数据以的二进制形式表现)

    • 字符串与字节串相互转化方法

      - 普通的英文字符字符串常量可以在前面加b转换为字节串,例如:b'hello'
      - 变量或者包含非英文字符的字符串转换为字节串方法 :str.encode()
      - 字节串转换为字符串方法 : bytes.decode() 
      ​
      注意:python字符串用来表达utf8字符,因为并不是所有二进制内容都可以转化为utf8字符,所以不是所有字节串都能转化为字符串,但是所有字符串都能转化成二进制,所以所有字符串都能转换为字节串。
  1. """
  2. 字节串类型:bytes
  3. 字符串 <--> 字节串 :decode,encode
  4. """
  5. # ascii字符:英文下的全部符号
  6. bytes1 = b"hello" # 英文:字符串-> 字节串
  7. print(bytes1) # b'hello' 二进制打印
  8. print(type(bytes1)) # <class 'bytes'>
  9. # 非ascii字符
  10. bytes2 = "你好".encode() # 非英文:字符串-> 字节串
  11. print(bytes2) # b'\xe4\xbd\xa0\xe5\xa5\xbd' 二进制打印
  12. print(bytes2.decode()) # 字节串-> 字符串
  13. print(bytes1.decode()) # 字节串-> 字符串

1.2 文件读写操作

使用程序操作文件,无外乎对文件进行读或者写(大前提是ls查看文件有读写权限)

  • 读 :即从文件中获取内容到程序

  • 写 :即通过程序修改文件中的内容

对文件实现读写的基本操作步骤为:打开文件,读写文件,关闭文件。

1.2.1 打开文件

file_object = open(file_name, access_mode='r', buffering=-1,encoding=None)
函数:内置函数(无需导入模块)  要点:功能 参数 返回值
功能:打开一个文件,返回一个文件对象。
参数:file_name  文件名;
     access_mode  打开文件的方式,如果不写默认为‘r’ 
     buffering  1表示有行缓冲,默认-1则表示使用系统默认提供的缓冲机制。
     encoding='UTF-8'  设置打开文件的编码方式,一般Linux下不需要直接默认none,win需要
返回值:成功返回文件操作对象。
打开模式效果
r以读方式打开,文件必须存在,否则报错
w以写方式打开,文件不存在则创建,存在清空原有内容
a以追加模式打开,文件不存在则创建,存在则继续进行写操作不清空原内容
r+以读写模式打开 文件必须存在
w+以读写模式打开文件,不存在则创建,存在清空原有内容
a+追加并可读模式,文件不存在则创建,存在则继续进行写操作
rb以二进制读模式打开 同r(上面是文本字符串进行读写,这以下字节串形式读写)
wb以二进制写模式打开 同w
ab以二进制追加模式打开 同a
rb+以二进制读写模式打开 同r+
wb+以二进制读写模式打开 同w+
ab+以二进制读写模式打开 同a+

注意 :

  1. b以二进制方式打开文件,读取内容为字节串,写入也需要写入字节串

  2. 不加b以文本字符串打开文件,读取内容字符串,写入也需要字符串

  3. 无论什么文件都可以使用二进制方式打开,但是非文本的二进制文件则不能以文本方式打开,否则后续读写会报错。

  1. """
  2. 文件打开
  3. """
  4. file = open("file1.txt", "w") # 文件不存在就创建,存在就清空文件内容
  5. # file = open("file1.txt", "r")#文件必须存在
  6. # file = open("file1.txt", "a")文件不存在就创建,存在不清空文件内容
  7. file.close()

1.2.2 读取文件

  • 方法1

read([size])
功能: 来直接读取文件中字符。
参数: 如果没有给定size参数(默认值为-1)或者size值为负,文件将被读取直至末尾,给定size最多读取给定数目个字符(字节)。
返回值: 返回读取到的内容
说明:中括号表示可选参数,可不写,默认读取全部,写上表示一次读取size个字节(论单位)或者字符(论个数),看你打开方式

注意:1. 文件过大时候不建议直接读取到文件结尾,占用内存较多,效率较低,循环读取

2. 读到文件结尾如果继续进行读操作会返回空字符串。

3. 文件里的空格与回车等皆是字符

  • 方法2

readline([size])
功能: 用来读取文件中一行
参数: 如果没有给定size参数(默认值为-1)或者size值为负,表示读取一行,给定size表示在一行里面最多读取制定的字符(或字节),通常如果按照行读取一般参数不写。
返回值: 返回读取到的内容
  • 方法3

readlines([sizeint])
功能: 读取文件中的每一行作为列表中的一项
参数: 如果没有给定size参数(默认值为-1)或者size值为负,文件将被读取直至末尾,给定size表示读取到size字符(字节)所在行为止。
返回值: 返回读取到的内容列表
  • 方法4

# 文件对象本身也是一个可迭代对象,在for循环中可以迭代文件的每一行。
for line in f:
     print(line,end = "")
  1. """
  2. 文件读取 read readline readlines
  3. 1.一个有英文一字节,一个汉字3字节
  4. 2.通常不会一次将文件内容全部读取到内存,
  5. 而是采取循环读取,一次读一点,速度更快
  6. 大文件通常不会一次性读取出来
  7. """
  8. # read
  9. # 字符串格式读取与字节串格式读取
  10. file = open("file2.txt", "r")
  11. data = file.read(4) # 空格回车也算字符
  12. print(data)
  13. file.close()
  14. file = open("file2.txt", "rb")
  15. data = file.read(4) # +b 读取4个字节
  16. print(data) # b'\xe7\xa9\xba\xe6'
  17. file.close()
  18. print("1-----------")
  19. # 循环每次读取一点
  20. file = open("file2.txt", "r")
  21. while True:
  22. data = file.read(1)
  23. if not data: # 文件最后字符是空判断
  24. break
  25. print(data, end="")
  26. file.close()
  27. print()
  28. print("2-----------")
  29. # readline
  30. file = open("file2.txt", "r")
  31. data = file.readline()
  32. print(data)
  33. data = file.readline()
  34. print(data)
  35. file.close()
  36. print("3-----------")
  37. # readlines
  38. file = open("file2.txt", "r")
  39. data = file.readlines()
  40. print(data)
  41. file.close()
  42. print("4-----------")
  43. # 迭代按行取值
  44. file = open("file2.txt", "r")
  45. for data in file:
  46. print(data, end="")
  47. file.close()
  1. """
  2. 练习 01 : 使用dict.txt文件完成
  3. 编写一个函数,参数传入一个单词,返回值是
  4. 这个单词对应的解释,如果这个单词不存在则
  5. 返回 Not Found 即可
  6. """
  7. def find_word(word):
  8. file = open("dict.txt", "r")
  9. while True:
  10. str_data = file.readline()
  11. list_data = str_data.split(" ", 1)
  12. if word < list_data[0]: # 增加查询效率,减少无效查询
  13. return "no this world"
  14. if word == list_data[0]:
  15. file.close()
  16. return list_data[1].lstrip()
  17. if not str_data:
  18. file.close()
  19. return "no this world"
  20. print(find_word("word"))
  21. # 方法二
  22. """
  23. 练习 01 : 使用dict.txt文件完成
  24. 编写一个函数,参数传入一个单词,返回值是
  25. 这个单词对应的解释,如果这个单词不存在则
  26. 返回 Not Found 即可
  27. """
  28. # str01 = "hello world"
  29. # str02 = str01.split(" ", 1) # 只切割一次
  30. # print(str02)
  31. #
  32. #
  33. # def find_word(word):
  34. # file = open("dict.txt", "r", encoding="UTF-8")
  35. # for line in file:
  36. # temp = line.split(" ", 1) # 切割第一个字符串成两块
  37. # if word < temp[0]: # 增加效率,后面不可能就不用遍历到尾了
  38. # break
  39. # elif temp[0] == word:
  40. # return temp[1].strip() # 去除两边空格
  41. # file.close()
  42. # return "not find your word"
  43. # print(find_word("world"))

1.2.3 写入文件

  • 方法1

write(data)
功能: 把文本数据或二进制数据块的字符(字节)串写入到文件中去(看你打开方式)
参数:要写入的内容
返回值:写入的字符(字节)个数

注意: 如果需要换行要自己在写入内容中添加\n

  • 方法2

writelines(str_list)
功能:接受一个字符串列表作为参数,将它们写入文件。
参数: 要写入的内容列表
  1. """
  2. 文件写操作
  3. write
  4. writelines
  5. """
  6. # write
  7. # 字符写入
  8. file = open("file3.txt", "w")
  9. file.write("你好 world\n")
  10. file.write("hello 世界\n")
  11. file.close()
  12. # 二进制写入,但呈现方式还是utf-8字符格式
  13. file = open("file3.txt", "ab")
  14. file.write("你好 world\n".encode())
  15. file.write("hello 世界\n".encode())
  16. file.close()
  17. # writelines
  18. file = open("file3.txt", "a")
  19. list01 = ["hello\n", "world\n"]
  20. file.writelines(list01)
  21. file.close()

1.2.4 关闭文件

打开一个文件后我们就可以通过文件对象对文件进行操作了,当操作结束后可以关闭文件操作

  • 方法

file_object.close()
  • 好处

  1. 可以销毁对象节省资源,(当然如果不关闭程序结束后对象也会被销毁)。

  2. 防止后面对这个对象的误操作。

1.2.5 with操作

python中的with语句也可以用于访问文件,在语句块结束后会自动释放资源。

  • with语句格式

with context_expression [as obj]:
    with-body
  • with访问文件

with open('file','r+') as f:  #等价于f = open()  然后只能在with语句块里面编写代码,并且最后不用关闭文件
    f.read()

注意 : with语句块结束后会自动释放f所以不再需要close().甚至close关闭会报错

  1. """
  2. with 语句块打开文件
  3. 作用是相当于lambda小型化简单快捷操作
  4. """
  5. with open("file4.txt", "w") as f:
  6. f.write("ni hao\n")
  7. # with 语句块结束,f文件对象自动销毁
  1. """
  2. 练习 02 : 重点练习
  3. 编写一个函数 复制一个文件
  4. 参数是要复制的文件 ,没有返回值
  5. 具体功能就是将要file3.txt复制一份到当前目录下名称叫file_new.txt
  6. 增加功能 : 文件不能一次读取,需要循环读写操作
  7. 思路 : 从原文件读 --> 写入新文件
  8. """
  9. def copy_file(filename_old):
  10. file_new = open("file_new.txt", "w")
  11. file_old = open(filename_old, "r")
  12. while True:
  13. data = file_old.read(1)
  14. file_new.write(data)
  15. if not data:
  16. break
  17. file_new.close()
  18. file_old.close()
  19. copy_file("file3.txt")
  1. #二进制文件:图片拷贝
  2. def copy_file(filename_old):
  3. file_new = open("download1.jpg", "wb")
  4. file_old = open(filename_old, "rb")
  5. while True:
  6. data = file_old.read(1024)
  7. if not data:
  8. break
  9. file_new.write(data)
  10. file_new.close()
  11. file_old.close()
  12. copy_file("download.jpg")

1.2.6 读写缓冲区

  • 定义

    系统自动的在内存中为每一个正在使用的文件开辟一个空间,在对文件读写时都是先将文件内容加载到缓冲区,再进行读写。a358761ec75945258ba4f8b1920021d6.png

    002088d4600843c787efc190c5c6da66.png

  • 作用

    1. 减少和磁盘的交互次数,保护磁盘。

    2. 提高了对文件的读写效率。

  • 缓冲区设置

    类型设置方法注意事项
    系统自定义缓冲区大小buffering=-1一般不容易写满
    行缓冲buffering=1当遇到\n时会刷新缓冲
    指定缓冲区大小(多少字节)buffering>1必须以二进制方式打开
  • 刷新缓冲区条件

  1. 缓冲区被写满

  2. 程序执行结束或者文件对象被关闭

  3. 程序中调用flush()函数

file_obj.flush()
  1. # file = open("file5.txt", "w",buffering=-1) # 系统默认缓冲值-1
  2. # file = open("file5.txt", "w", buffering=1) # 行缓冲
  3. file = open("file5.txt", "wb", buffering=5) # 制定缓冲区大小
  4. while True:
  5. message = input(">>")
  6. if not message:
  7. break
  8. # file.write(message + "\n") # 换行缓冲
  9. file.write(message.encode())
  10. # file.flush() # 主动刷新缓冲区

1.2.7 文件偏移量(本质是整数)

  • 定义

    打开一个文件进行操作时系统会自动生成一个记录,记录每次读写操作时所处的文件位置,每次文件的读写操作都是从这个位置开始进行的。d5e662033a034c748e0ce29ca1cea8f6.png

    注意:

    1. r或者w方式打开,文件偏移量在文件开始位置

    2. a方式打开,文件偏移量在文件结尾位置

    • 文件偏移量控制

      tell()
      功能:获取文件偏移量大小(字节为单位)
      返回值:文件偏移量
      seek(offset,[whence])
      功能: 移动文件偏移量位置
      参数:offset  代表相对于某个位置移动的字节数(因此要用二进制方式打开)。负数表示向前移动,正数表示向后移动。
           whence是基准位置的默认值为 0,代表从文件开头算起,1代表从当前位置算起,2 代表从文件末尾算起。

      注意:1.必须以二进制方式打开文件时,基准位置才能用上是1或者2,不然报错

                    seek(0,0)表示偏移位置移动到开头,可以不用以二进制方式打开

                 2.如果偏移位置在内容之中再写入内容就是覆盖方式写入

  1. """
  2. 文件偏移量演示
  3. 可以提前预占空间的作用
  4. """
  5. # 读写方式打开 打开一个文件,共用一个偏移量,
  6. # 因此你要保证读取东西的偏移位置,找错位置读就容易读错
  7. file = open("file6.txt", "wb+")
  8. file.write("今天天气好晴朗".encode())
  9. file.flush()
  10. print("偏移量:", file.tell()) # 21 记录偏移量位置(按照字节来表示的)
  11. # 修改偏移量位置 必须以字节方式打开与读写
  12. file.seek(-15, 2) # 从末尾算起,往前移动15个字节(5个汉字)
  13. data = file.read()
  14. print(data.decode()) # 天气好晴朗
  15. print("偏移量:", file.tell())
  16. file.seek(0, 0)
  17. file.write("哈哈".encode())#是覆盖插入
  18. file.close()

小应用:提前预占内存

c9d17ed517ac4e36be761dc86283d1fa.png

ed83774acf4841ff814096ddb468ca73.png

  1. """
  2. 练习03 :
  3. 编写一个程序,向一个 文件中循环写入如下内容
  4. 每隔2秒写入一行 直到强行退出
  5. 1. Mon Mar 29 16:46:42 2021
  6. 2. Mon Mar 29 16:46:44 2021
  7. 3. Mon Mar 29 16:46:46 2021
  8. 4. Mon Mar 29 16:46:48 2021
  9. 5. Mon Mar 29 16:51:22 2021
  10. 6. Mon Mar 29 16:51:24 2021
  11. 要求: 每条占一行,并且每次写入实时可以看到
  12. 当程序退出后,如果重新启动,序号可以衔接
  13. 提示函数 : time.ctime() time.sleep(2)
  14. """
  15. import time
  16. file = open("file7.txt", "a+", buffering=1)
  17. file.seek(0, 0)
  18. line = len(file.readlines())
  19. while True:
  20. line = line + 1
  21. file.write(str(line) + ". " + time.ctime() + "\n")
  22. time.sleep(1)

1.3 os模块

os模块是Python标准库模块,包含了大量的文件处理函数。

  • 获取文件大小

os.path.getsize(file)
功能: 获取文件大小
参数: 指定文件
返回值: 文件大小
  • 查看文件列表

os.listdir(dir)
功能: 查看文件列表
参数: 指定目录
返回值:目录中的文件名列表
  • 判断文件是否存在

os.path.exists(file)
功能: 判断文件是否存在
参数: 指定文件
返回值: 布尔值
  • 删除文件

os.remove(file)
功能: 删除文件 
参数: 指定文件
  1. """
  2. os模块下的几个文件处理小函数
  3. """
  4. import os
  5. # 获取文件大小 字节数
  6. print(os.path.getsize("file3.txt"))
  7. # 获取文件夹中所有文件名称
  8. print(os.listdir("."))
  9. # 判断一个文件是否存在 返回值bool
  10. print(os.path.exists("file3.txt"))
  11. #删除文件
  12. os.remove("file33.txt")

3.txt课堂随记

------------------------------------------------------------------------------------------------------------------

前情回顾

1. Linux命令

   权限 : sudo  chmod
   其他 : shutdown   ln

   通配符  *     管道  |      输出重定向 >  >>

2. 服务器环境
   vi 编辑器
   用户管理: useradd  passwd
   软件管理: apt install   apt remove
   远程登录: ssh     秘钥对
   程序运行:  #!/usr/bin/python3

-----------------------------------------------------------------------------

练习 01 : 使用dict.txt文件完成
编写一个函数,参数传入一个单词,返回值是
这个单词对应的解释,如果这个单词不存在则
返回 Not Found 即可

提示: split()


练习 02 :
编写一个函数 复制一个文件
参数是要复制的文件 ,没有返回值
具体功能就是将要复制的文件复制一份到主目录下
plus : 文件不能一次读取,需要循环读写操作

def copy(filename):
    pass

copy("./3.txt")

练习03 :
编写一个程序,向一个 文件中循环写入如下内容
每隔2秒写入一行 直到强行退出

1. Mon Mar 29 16:46:42 2021
2. Mon Mar 29 16:46:44 2021
3. Mon Mar 29 16:46:46 2021
4. Mon Mar 29 16:46:48 2021
5. Mon Mar 29 16:51:22 2021
6. Mon Mar 29 16:51:24 2021
要求: 每条占一行,并且每次写入实时可以看到
      当程序退出后,如果重新启动,序号可以衔接
提示函数 : time.ctime() time.sleep(2)


知识要点 : open()  read()  write()  close()
          文件拷贝练习

作业 : 1. 熟练使用文件读写操作函数

       2. 编写一个函数,传入一个目录(假设该
       目录中全是文本文件),函数的功能是将这些文本
       文件合并为一个大文件

       def union_files(dir):
           pass

  1. """
  2. 编写一个函数,传入一个目录(假设该
  3. 目录中全是文本文件),函数的功能是将这些文本
  4. 文件合并为一个大文件
  5. def union_files(dir):
  6. pass
  7. """
  8. import os
  9. def copy_file(filename_old):
  10. file_new = open("file_union.txt", "a")
  11. file_old = open("./dir/" + filename_old, "r")
  12. while True:
  13. data = file_old.read(1024)
  14. if not data:
  15. break
  16. file_new.write(data)
  17. file_new.close()
  18. file_old.close()
  19. def union_files(dir):
  20. list_dir = os.listdir(dir)
  21. for item in list_dir:
  22. copy_file(item)
  23. union_files("./dir/")

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/278201
推荐阅读
相关标签
  

闽ICP备14008679号