字符编码表

字符编码表.png

python解释器和编码

python解释器和编码.png

编码与解码

编码与解码.png

文件及操作

文件.png

文件修改的方式

  1. # 文件a.txt内容如下
  2. 张一蛋 山东 179 49 12344234523
  3. 李二蛋 河北 163 57 13913453521
  4. 王全蛋 山西 153 62 18651433422
  5. # 执行操作
  6. with open('a.txt',mode='r+t',encoding='utf-8') as f:
  7. f.seek(9)
  8. f.write('<妇女主任>')
  9. # 文件修改后的内容如下
  10. 张一蛋<妇女主任> 179 49 12344234523
  11. 李二蛋 河北 163 57 13913453521
  12. 王全蛋 山西 153 62 18651433422
  13. # 强调:
  14. # 1、硬盘空间是无法修改的,硬盘中数据的更新都是用新内容覆盖旧内容
  15. # 2、内存中的数据是可以修改的
  16. # 3、我们平时修改的文本编辑器,其实改的是内存中的内容,当你按下ctrl+S时,才会重新写入硬盘
  1. # 边打开边写入:文件会被直接清空,也没有任何内容输出。
  2. with open('file_n.txt', mode='rt', encoding='utf-8') as f:
  3. with open('file_n.txt', mode='wt', encoding='utf-8') as f1:
  4. res = f.read().replace("1", "aaa")
  5. f1.write(res)
  6. # 方式一
  7. with open('db.txt',mode='rt',encoding='utf-8') as f:
  8. data=f.read()
  9. with open('db.txt',mode='wt',encoding='utf-8') as f:
  10. f.write(data.replace('kevin','hahaha'))
  11. """
  12. 实现思路:将文件内容发一次性全部读入内存,然后在内存中修改完毕后再覆盖写回原文件
  13. - 优点: 在文件修改过程中同一份数据只有一份
  14. - 缺点: 会过多地占用内存(也有断电清空内容的风险)
  15. """
  1. import os
  2. with open('db.txt',mode='rt',encoding='utf-8') as read_f,\
  3. open('.db.txt.swap',mode='wt',encoding='utf-8') as wrife_f:
  4. for line in read_f:
  5. wrife_f.write(line.replace('SB','kevin'))
  6. os.remove('db.txt') # 删除原来的文件
  7. os.rename('.db.txt.swap','db.txt') # 重命名新的文件
  8. """
  9. 实现思路:以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容
  10. 修改完后写入临时文件,删掉原文件,将临时文件重命名原文件名
  11. - 优点: 不会占用过多的内存
  12. - 缺点: 在文件修改过程中同一份数据存了两份
  13. """

文件中的一些坑(+模式)

  1. # 前提文件内容为:
  2. with open(r"file_n.txt", mode="wt", encoding="utf-8") as f:
  3. f.write("123\n456\n中文字符\n")
  4. # 写入后的文件内容:
  5. 123
  6. 456
  7. 中文字符
  8. #### 写出一下语句输出内容和文件中的内容
  9. # 语句一
  10. with open(r"file_n.txt", mode="r+t", encoding="utf-8") as f:
  11. f.write("88")
  12. res = f.read()
  13. print(res)
  14. """
  15. # 输出内容:
  16. 3
  17. 456
  18. 中文字符
  19. # 文件内容:
  20. 883
  21. 456
  22. 中文字符
  23. 出现原因:r+模式:
  24. - r+模式下写入 是从文件首部进行覆盖,因此88会覆盖原来的12
  25. - f.write之后文件指针的位置在88之后,因此从88之后开始读取文件
  26. """
  27. ## 语句二
  28. with open(r"file_n.txt", mode="w+t", encoding="utf-8") as f:
  29. f.write("88")
  30. res = f.read()
  31. f.write("66")
  32. print(res)
  33. """
  34. # 输出内容
  35. 无内容输出
  36. # 文件内容
  37. 8866
  38. 出现原因:w+模式
  39. - w 模式打开文件,就会将原来的文件清空。
  40. - w+模式后又写入了88,文件指针在88之后,因此读不出来内容
  41. """
  42. ## 语句3
  43. with open(r"file_n.txt", mode="wt", encoding="utf-8") as f:
  44. pass
  45. """
  46. 即使没有内容运行,open()以w模式打开文件,文件也会被清空
  47. """
  48. ## 语句4
  49. with open(r"file_n.jpg", mode="rt", encoding="utf-8") as f:
  50. pass
  51. """
  52. 以t模式,打开非文本文件,即使指定了编码,也不会报错。因为这条语句仅仅是打开了文件,并没有进行任何操作
  53. """

关于读的一些操作(循环读取文件)

for

  1. with open(r"test.txt", mode="rt", encoding="utf-8") as f:
  2. for line in f: # 按行读文件
  3. f.read(line)
  4. with open(r"test.jpg", mode="rb") as f:
  5. for line in f: # 按行读文件
  6. f.read(line)

while

  1. with open(r'test.jpg',mode='rb') as f:
  2. while True:
  3. res=f.read(1024) # 每次读1024个字节
  4. if not res: # 判断一下是否还有字节,没有字节就跳出
  5. break
  6. print(res)
  7. """
  8. 注:当文件一行内容过多时,使用for循环按行读取可能会占用内存过多,最好还是使用while根据指定字节数读取
  9. """

关于写的一些操作(重点为wb模式)

  1. In[1]:"哈哈哈".encode("utf-8")
  2. Out[1]: b'\xe5\x93\x88\xe5\x93\x88\xe5\x93\x88'
  3. In[2]:bytes("哈哈哈",encoding="utf-8")
  4. Out[2]: b'\xe5\x93\x88\xe5\x93\x88\xe5\x93\x88'
  5. In[3]:"哈哈哈".encode("gbk")
  6. Out[3]: b'\xb9\xfe\xb9\xfe\xb9\xfe'
  7. In[4]:bytes("哈哈哈",encoding="gbk")
  8. Out[4]: b'\xb9\xfe\xb9\xfe\xb9\xfe'
  9. In[5]:bytes("abc123",encoding="utf-8")
  10. Out[5]: b'abc123'
  11. In[6]:"abc123".encode("utf-8")
  12. Out[6]: b'abc123'

f.writelines()

  1. with open(r"file_n.txt", mode="wt", encoding="utf-8") as f:
  2. # 只写444会报错的,只要不是字符串或者bytes类型都会报错,无法写入
  3. l = ["第一个", "第二个", "第三个", "555"]
  4. f.writelines(l)
  5. # f.write(l)
  6. >>> 文件内容为 "第一个第二个第三个555"
  7. with open(r"file_name.txt", mode="wb") as f:
  8. # 如果是b模式,写入的内容可以编码转化
  9. # l1 = [
  10. # "111".encode("utf=8"),
  11. # "222".encode("utf-8"),
  12. # "ccc".encode("utf-8")
  13. # ]
  14. # 1. 但如果只有英文和数字,可以直接加前缀b得到bytes类型
  15. l1 = [
  16. b"111",
  17. b"222",
  18. b"ccc"
  19. ]
  20. # 2. '中文'.encode("utf-8")等同于bytes("中文", encoding="utf-8")
  21. l1 = [
  22. bytes("哈哈哈", encoding="utf-8"),
  23. bytes("你好", encoding="utf-8"),
  24. bytes("我爱你", encoding="utf-8")
  25. ]
  26. f.writelines(l1)

f.flush()

  1. with open(r"file_n.txt", mode="wt", encoding="utf-8") as f:
  2. # 只写444会报错的,只要不是字符串或者bytes类型都会报错,无法写入
  3. ls = ["第一个", "第二个", "第三个", "555"]
  4. f.writelines(ls)
  5. f.flush() #强行把缓冲区中的内容放到磁盘中
  6. # f.write(l)
  7. """
  8. 当没有输入回车键时,数据也依然写入到文件中,如果没有flush()方法的话,那么只有按下回车键才会把数据保存到文件中
  9. """

打印进度条(\r)

  1. import time
  2. for i in range(1, 101):
  3. # print("\r[{}{} {}/100]".format('#'*i, '-'*(100 - i),i),end="")
  4. print(f"\r[{'#' * i}{'-' * (100 - i)} {i}/100]", end="")
  5. # print("\r" + "[" + "#" * i + "-" * (100 - i) + " " + str(i) + "/100]", end="")
  6. time.sleep(0.1)