前言时刻:

今天挑战一下,将day08和day09的搞定。今天主要学习了文件的操作读写、

来来总结一波:

学习了文件的读:r、rb、r+、r+b

写:w、wb、w+、w+b

文件句柄,seek光标,flush强制刷新文件内容,tell:告诉当前句柄所在的位置(int)

Day09:函数的定义

传参:实参、形参

1、文件操作

Python 中的文件操作很重要,虽然不难,但是坑不少,比如:文件的编码方式。如果你搞懂 Python 的编码方式了,这都不是问题,具体可看我之前写的文章:Python文件编码问题。还有就是应用场景很多,比如机器学习中数据的读取和写入、Web 爬虫的数据存取等。

  1. open(file, mode='w', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

参数说明:

  • file: 必需,文件路径(相对或者绝对路径)。
  • mode: 可选,文件操作模式

    • 写:w、wb、w+、wb+,读:r、rb、r+、rb+
  • buffering: 设置缓冲
  • encoding: 若不设置则默认和操作系统的默认编码方式一样。比如:Mac OS上是 UTF-8,Windows上是 gbk,不过 win10 上改成 UTF-8 了,Linux 上是 UTF-8。按照解码和编码方式一样的原则,有UTF-8、GBK等。
  • errors: 报错级别
  • newline: 区分换行符
  • closefd: 传入的file参数类型
  • opener: 设置自定义开启器,开启器的返回值必须是一个打开的文件描述符。

1.1、写入文件操作

写入的 mode 有:w 以 Unicode 的方式写入文件内容,wb 写入二进制的文件内容,w+ 可以读取也可以写入,加号相当于是添加了一个功能,wb+ 可读可写二进制文件。

  1. # 1、麻烦的一种方式,
  2. file_name = "write_test.txt"
  3. f = open('write_test.txt', mode='w', encoding="utf8") # 定义操作文件的句柄f,
  4. f.write("这是一个") # 写入内容
  5. f.close() # 关闭文件句柄
  6. # 2、推荐方式 使用with,结束后自动关闭句柄
  7. with open("write_test.txt", mode='w', encoding="utf8") as f, open("test2.txt", 'w', encoding="utf8") as f2:
  8. f.write("我是主流with读取文件的方式。")
  9. f2.write("with 可以并列操作几个文件哈")

1.2、读取文件操作

写入的 mode 有:r 以 Unicode 的方式读取文件内容,rb 读取二进制的文件内容,r+ 可以读取也可以写入,加号相当于是添加了一个功能,rb+ 可读可写 二进制文件。

读取文件的方式需重点掌握,

  1. """
  2. write_test.txt 文件的内容:
  3. 我是主流with读取文件的方式。
  4. hi 第二行
  5. """

read 方法:

使用 f.read()方法读取文件不是很推荐,因为他会一次性将文件所有数据读取到内存中。

  1. # 1、read方法
  2. with open("write_test.txt", mode='r', encoding="utf8") as f:
  3. content = f.read()
  4. print(content)
  5. # 1.2、读取前n个字符
  6. print(f.tell()) # 53 tell 当前光标的位置
  7. f.seek(0) # seek 将光标移动到0的位置 单位是字节byte
  8. print(f.read(4)) # 我是主流 read(n) 读取前n个字符
  • f.tell() 返回当前文件句柄的光标的位置,单位是字节
  • f.seek(number) 将光标移到 number 的位置,单位是字节byte
  • f.read(number) 读取当前光标后面的 number 个字符
  • 解释下,字符和字符的区别,英文字母的话一个字符=一个字节,但是中文,一个中文字符=3个字节。还是数据编码的问题,哈哈,如果搞懂了,这里so easy。

readline和readlines 方法:

f.readline() 读取当前光标所在行的光标之后的内容。

  1. """
  2. write_test.txt 内容:
  3. 我爱
  4. 学习Python
  5. """
  6. # 2、readline
  7. with open("write_test.txt", mode='r', encoding="utf8") as f:
  8. f.seek(10)
  9. content = f.readline()
  10. print(content) # 习Python

来来解释一下,首先我使用 seek(7) 将光标移动到第七个字节上(“学习”占用6个字节+紧接着是换行符占用一个自字节+第二行的”学“占3个字节),就到了第二行的”学“之后,然后使用 readline() 就读到了”习Python“。

f.readlines() 返回文件中所有行内容的列表,以换行符作为分隔。

  1. # 3、readlines
  2. with open("write_test.txt", mode='r', encoding="utf8") as f:
  3. content = f.readlines()
  4. print(content, type(content))
  5. # ['我是主流with读取文件的方式。\n', 'hi 第二行'] <class 'list'>

小总结:readlines() 方法针对小文件而言,适合而且快;但是对于一个大的文件,一次性完全读取到内存中,就很费资源,不是很推荐。

但是我 Python 怎么可能不解决此问题,请出我们今天的读取文件的主角方式 迭代读取文件内容

迭代读取文件:

推荐,

  1. """
  2. write_test.txt 内容:
  3. 我爱
  4. 学习Python
  5. """
  6. # 2、readline
  7. with open("write_test.txt", encoding="utf8") as f:
  8. for each in f:
  9. print(each)
  10. # 打印:
  11. """
  12. 我爱
  13. 学习Python
  14. """

总结:

文件操作很重要,但是少不了文件编码的问题,所以要搞懂编码问题。否则后面再有编码的问题,在学习就有点浪费时间了。

参考文章:

https://www.zwjjiaozhu.top/2021/01/understand-python-file-encode-method.html

https://www.runoob.com/python/file-methods.html