r模式

read():逐字符读取,可指定参数
readline():只能读取第一行代码
readlines():读取内容以列表的形式输出

w模式

进行操作前,文件中的数据会被清空
write():将字符串写入文件,返回写入的字符长度
writelines():将字符串或字符串序列写入文件,无返回

a模式

追加写入

tell()查询文件中光标位置

seek()光标定位

  1. f = open('file','r')
  2. print(f.read(6)) #6个字符
  3. print(f.tell()) #位置12字节,一个汉字两个字节
  4. f.close()
  5. f = open('file','r')
  6. f.seek(6) #6个字节
  7. print(f.tell())
  8. f.close()
  9. f = open('file','a')
  10. print(f.tell()) #光标默认在最后位置
  11. f.write('你好 世界')
  12. print(f.tell()) #光标向后9个字节,一个汉字两个字节,
  13. f.close()
  14. f = open('file','a',encoding='utf-8')
  15. print(f.truncate(6)) #由于需要光标定位位置,所以也是字节。只显示6个字节的内容(6个英文字母或三个汉字,一个汉字两个字节),后面的内容被清空。
  16. f.close()

flush 同步将数据从缓存转移到磁盘

实现进度条功能:

  1. import sys,time #导入sys和time模块
  2. for i in range(40):
  3. sys.stdout.write('*')
  4. sys.stdout.flush() #flush的作用相当于照相,拍一张冲洗一张
  5. time.sleep(0.2)
  6. 下面代码也能够实现相同的功能
  7. import time
  8. for i in range(40):
  9. print('*',end='',flush=True) #print中的flush参数
  10. time.sleep(0.2)

truncate截断

  1. f = open('file','a')
  2. f.truncate(6) #只显示6个字节的内容(6个英文字符或三个汉字),后面的内容被清空。
  3. """--------------"""
  4. ff = open('7_17_test.py', 'r+')
  5. ff.truncate(10) # 截断指定字符
  6. print(ff.read())
  7. # # -*- codi

with打开多个文件

  1. with open('test.txt', 'r', encoding='utf-8') as f1, open('test2.txt', 'w', encoding='utf-8') as f2:
  2. for line in f1:
  3. line = ''.join([line.strip(), 'yang'])
  4. print(line)
  5. f2.write(line)

StringIO

读写文件,一般在磁盘上读写文件的功能都是由操作系统提供的,读写文件是请求操作系统打开一个文件对象(文件描述符),然后通过操作系统提供的接口从文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件);
当然读写文件也可以在内存中读写,StringIO就是在内存中读写str。

getvaule():获得写入后的str;

  1. from io import StringIO
  2. f = StringIO()
  3. f.write("hello")
  4. print(f.getvalue()) # hello
  5. while True:
  6. s = f.readline()
  7. if s == '':
  8. break
  9. print(s.strip())
  10. f.write("中文")
  11. print(f.getvalue()) # hello中文

文件常用读写总结

  1. #!/usr/bin/env python
  2. # -*- encoding: utf-8 -*-
  3. """
  4. # @File : file_test.py
  5. # @Time : 2022/01/12 23:43:54
  6. # @Author : wangshunzhe
  7. 读写文件处理总结
  8. """
  9. from logzero import logger
  10. """
  11. read():读取文件全部内容,加上参数可指定读取字符
  12. readline():读取文件的一行
  13. readlines():读取文件所有行到内存中
  14. """
  15. """read一次性全文本读取文件"""
  16. with open("wanshunzhe_script/tests/file/test.txt", "r", encoding="utf-8") as f:
  17. results = f.read()
  18. logger.info(results)
  19. """read按字节读取文件:
  20. 适合于分批处理文本信息,每次批量读入,批量处理,不会对内存造成较大的压力"""
  21. with open("wanshunzhe_script/tests/file/test.txt", "r", encoding="utf-8") as f:
  22. index = 0
  23. results = f.read(100)
  24. logger.info(results)
  25. while results != "":
  26. index += 1
  27. results = f.read(100)
  28. logger.info(results)
  29. logger.info(f"index = {index}")
  30. """readliines:
  31. 适合处理以行为分割特点的文本,这种处理方式需要一次性把文件所有内容读取到内存中,
  32. 会逐行处理,对一些大文件的处理是很有效的"""
  33. with open("wanshunzhe_script/tests/file/test.txt", "r", encoding="utf-8") as f:
  34. res = f.readlines()
  35. logger.info(res)
  36. """readline:每次只读取一行"""
  37. with open("wanshunzhe_script/tests/file/test.txt", "r", encoding="utf-8") as f:
  38. res = f.readline()
  39. logger.info(res)
  40. while res != "":
  41. res = f.readline()
  42. logger.info(res)
  43. """
  44. write:向文件中写入一个字符或者字节流
  45. writelines:将字符串或字符串序列写入文件,无返回
  46. w+:打开一文件用于读写
  47. """
  48. list = ["中午","早上","晚上"]
  49. with open("wanshunzhe_script/tests/file/output.txt", "w+") as file_name:
  50. file_name.writelines(list)
  51. file_name.seek(0) # 调整写的指针到文件的开始位置
  52. for line in file_name:
  53. # 读取写入的数据,这时候发现是没有任何内容的
  54. logger.info(line)

内置模块fileinput读取文件

最适合用来读取文件!! 重点介绍的方法: fileinput.filename(): 返回当前读取的文件名 fileinput.fileno(): 返回已被读取的行数,第一行被读取之前返回为0 fileinput.filelineno(): 批量打开多个文件时使用真实行号 fileinput.isfirstline(): 判断读取的是否是文件的第一行 fileinput.close(): 关闭打开文件

  1. import fileinput
  2. # 单独打开一个文件
  3. with fileinput.input(files=('./wanshunzhe_script/tests/base/magic_module.py', )) as file:
  4. for line in file:
  5. print(f'{fileinput.filename()} 第 {fileinput.lineno()} 行: {line}')
  6. # 批量打开多个文件
  7. # fileinput.lineno():批量打开多个文件时不使用真实行号
  8. # fileinput.filelineno(): 批量打开多个文件时使用真实行号
  9. with fileinput.input(
  10. files=(
  11. './wanshunzhe_script/tests/base/magic_module.py',
  12. 'wanshunzhe_script/tests/base/list_test.py'
  13. )
  14. ) as file:
  15. for line in file:
  16. print(f'{fileinput.filename()} 第 {fileinput.filelineno()} 行: {line}')
  17. # 配合glob 批量打开多个文件
  18. import glob
  19. for line in fileinput.input(glob.glob("./wanshunzhe_script/tests/base/*.log")):
  20. if fileinput.isfirstline():
  21. print(f'{"#" * 20} Reading {fileinput.filename()} {"#" * 20}')
  22. print(str(fileinput.lineno()) + ': ' + line.upper(), end='')
  23. # 标准输出重定向替换: inplace=True
  24. import glob
  25. print(f"{'*' * 20} Start Task {'*' * 20}")
  26. for line in fileinput.input(glob.glob("./wanshunzhe_script/tests/base/*.log"), inplace=True):
  27. if fileinput.isfirstline():
  28. print(f'{"#" * 20} Reading {fileinput.filename()} {"#" * 20}')
  29. print(str(fileinput.lineno()) + ': ' + line.upper(), end='')
  30. print(f"{'*' * 20} End Task {'*' * 20}")
  31. """
  32. 自定义对象读取方法
  33. 使用fileinput.input() 中的openhook参数
  34. """
  35. def online_open(url, mode):
  36. """
  37. 自定义读取方法
  38. """
  39. import requests
  40. r = requests.get(url)
  41. filename = url.split("/")[-1]
  42. print(f'filename: {filename}')
  43. with open(filename, 'w') as f1:
  44. f1.write(r.content.decode('utf-8'))
  45. f2 = open(filename, "r")
  46. return f2
  47. file_url = "https://www.csdn.net/robots.txt"
  48. with fileinput.input(files=(file_url, ), openhook=online_open) as file:
  49. for line in file:
  50. print(line, end="")
  51. # User-agent: *
  52. # Disallow: /scripts
  53. # Disallow: /public
  54. # Disallow: /css/
  55. # Disallow: /images/
  56. # Disallow: /content/
  57. # Disallow: /ui/
  58. # Disallow: /js/
  59. # Disallow: /scripts/
  60. # Disallow: /article_preview.html*
  61. # Disallow: /tag/
  62. # Disallow: /*?*
  63. # Disallow: /link/
  64. # Sitemap: https://www.csdn.net/sitemap-aggpage-index.xml
  65. # Sitemap: https://www.csdn.net/article/sitemap.txt