简述

掌握文件的使用方法,理解一二维数据,掌握wordcloud库,能够处理包含一二维数据的文件,能够用程序绘制词云。

课件

7.pdf

代码汇总

  1. "中国是一个伟大的国家"
  1. tf = open("f.txt", "rt")
  2. print(tf.readline()) # "中国是一个伟大的国家"
  3. tf.close()
  1. tf = open("f.txt", "rb")
  2. print(tf.readline()) # b'"\xe4\xb8\xad\xe5\x9b\xbd\xe6\x98\xaf\xe4\xb8\x80\xe4\xb8\xaa\xe4\xbc\x9f\xe5\xa4\xa7\xe7\x9a\x84\xe5\x9b\xbd\xe5\xae\xb6"'
  3. tf.close()

  1. f = open("f.txt") # 文本形式、只读模式、默认值
  2. f = open("f.txt", "rt") # 文本形式、只读模式、同默认值
  3. f = open("f.txt", "w") # 文本形式、覆盖写模式
  4. f = open("f.txt", "a+") # 文本形式、追加写模式+ 读文件
  5. f = open("f.txt", "a") # 文本形式、追加写模式(不能读)
  6. f = open("f.txt", "x") # 文本形式、创建写模式
  7. f = open("f.txt", "b") # 二进制形式、只读模式
  8. f = open("f.txt", "wb") # 二进制形式、覆盖写模式

  1. fname = input("请输入要打开的文件名称:")
  2. fo = open(fname, 'r')
  3. txt = fo.read() # 一次读入,统一处理
  4. fo.close()
  1. fname = input("请输入要打开的文件名称:")
  2. fo = open(fname, 'r')
  3. txt = fo.read(2) # 按数量读入,逐步处理
  4. while txt != "":
  5. txt = fo.read(2)
  6. fo.close()
  1. fname = input("请输入要打开的文件名称:")
  2. fo = open(fname, 'r')
  3. for line in fo.readline(): # 一次读入,分行处理
  4. print(line)
  5. fo.close()
  1. fname = input("请输入要打开的文件名称:")
  2. fo = open(fname, 'r')
  3. for line in fo: # 分行读入,逐行处理
  4. print(line)
  5. fo.close()

  1. fo = open("output.txt", "w+")
  2. ls = ["中国", "法国", "美国"]
  3. fo.writelines(ls)
  4. # fo.seek(0)
  5. for line in fo:
  6. print(line)
  7. fo.close()
  8. '''
  9. 输出结果为空
  10. '''
  1. fo = open("output.txt", "w+")
  2. ls = ["中国", "法国", "美国"]
  3. fo.writelines(ls)
  4. fo.seek(0)
  5. for line in fo:
  6. print(line)
  7. fo.close()
  8. '''
  9. 中国法国美国
  10. '''

  1. 300,0,144,1,0,0
  2. 300,0,144,0,1,0
  3. 300,0,144,0,0,1
  4. 300,0,144,1,1,0
  5. 300,0,108,0,1,1
  6. 184,0,72,1,0,1
  7. 184,0,72,0,0,0
  8. 184,0,72,0,0,0
  9. 184,0,72,0,0,0
  10. 184,1,72,1,0,1
  11. 184,1,72,0,0,0
  12. 184,1,72,0,0,0
  13. 184,1,72,0,0,0
  14. 184,1,72,0,0,0
  15. 184,1,720,0,0,0
  1. import turtle as t
  2. t.title("自动轨迹绘制")
  3. t.setup(800, 600, 0, 0)
  4. t.pencolor("red")
  5. t.pensize(5)
  6. # 数据读取
  7. datals = []
  8. f = open("data.txt")
  9. for line in f:
  10. print('line:', line)
  11. line = line.replace("\n", "")
  12. datals.append(list(map(eval, line.split(","))))
  13. print('datals:', datals)
  14. f.close()
  15. # 自动绘制
  16. for i in range(len(datals)):
  17. t.pencolor(datals[i][3], datals[i][4], datals[i][5])
  18. t.fd(datals[i][0])
  19. if datals[i][1]:
  20. t.rt(datals[i][2])
  21. else:
  22. t.lt(datals[i][2])
  23. if i == (len(datals) - 1):
  24. t.done()
  25. """
  26. line: 300,0,144,1,0,0
  27. line: 300,0,144,0,1,0
  28. line: 300,0,144,0,0,1
  29. line: 300,0,144,1,1,0
  30. line: 300,0,108,0,1,1
  31. line: 184,0,72,1,0,1
  32. line: 184,0,72,0,0,0
  33. line: 184,0,72,0,0,0
  34. line: 184,0,72,0,0,0
  35. line: 184,1,72,1,0,1
  36. line: 184,1,72,0,0,0
  37. line: 184,1,72,0,0,0
  38. line: 184,1,72,0,0,0
  39. line: 184,1,72,0,0,0
  40. line: 184,1,720,0,0,0
  41. datals: [
  42. [300, 0, 144, 1, 0, 0],
  43. [300, 0, 144, 0, 1, 0],
  44. [300, 0, 144, 0, 0, 1],
  45. [300, 0, 144, 1, 1, 0],
  46. [300, 0, 108, 0, 1, 1],
  47. [184, 0, 72, 1, 0, 1],
  48. [184, 0, 72, 0, 0, 0],
  49. [184, 0, 72, 0, 0, 0],
  50. [184, 0, 72, 0, 0, 0],
  51. [184, 1, 72, 1, 0, 1],
  52. [184, 1, 72, 0, 0, 0],
  53. [184, 1, 72, 0, 0, 0],
  54. [184, 1, 72, 0, 0, 0],
  55. [184, 1, 72, 0, 0, 0],
  56. [184, 1, 720, 0, 0, 0]
  57. ]
  58. """

image.png


  1. 中国 美国 日本 德国 法国 英国 意大利
  1. filename = "1.txt"
  2. f = open(filename)
  3. txt = f.read()
  4. ls = txt.split()
  5. print('ls:', ls) # ls: ['中国', '美国', '日本', '德国', '法国', '英国', '意大利']
  6. f.close()

  1. 中国$美国$日本$德国$法国$英国$意大利
  1. filename = "1.txt"
  2. f = open(filename)
  3. txt = f.read()
  4. ls = txt.split('$')
  5. print('ls:', ls) # ls: ['中国', '美国', '日本', '德国', '法国', '英国', '意大利']
  6. f.close()

  1. ls = ["中国", "美国", "日本"]
  2. fname = "1.txt"
  3. f = open(fname, "w")
  4. f.write(" ".join(ls))
  5. f.close()
  1. 中国 美国 日本

  1. ls = ["中国", "美国", "日本"]
  2. fname = "1.txt"
  3. f = open(fname, "w")
  4. f.write("$".join(ls))
  5. f.close()
  1. 中国$美国$日本

  1. 城市,环比,同比,定基
  2. 北京,101.5,120.7,121.4
  3. 上海,101.2,127.3,127.8
  4. 广州,101.3,119.4,120.0
  5. 深圳,102.0,140.0,145.5
  6. 沈阳,100.0,101.4,101.6
  1. fname = "1.csv"
  2. fo = open(fname)
  3. ls = []
  4. for line in fo:
  5. line = line.replace("\n", "")
  6. ls.append(line.split(","))
  7. fo.close()
  8. print(ls)
  9. """
  10. [
  11. ["城市", "环比", "同比", "定基"],
  12. ["北京", "101.5", "120.7", "121.4"],
  13. ["上海", "101.2", "127.3", "127.8"],
  14. ["广州", "101.3", "119.4", "120.0"],
  15. ["深圳", "102.0", "140.0", "145.5"],
  16. ["沈阳", "100.0", "101.4", "101.6"],
  17. ]
  18. """

  1. fname = "output.csv"
  2. ls = [["1", "2", "3"], ["4", "5", "6"], ["7", "8", "9"]] # 二维列表
  3. f = open(fname, "w")
  4. for item in ls:
  5. f.write(",".join(item) + "\n")
  6. f.close()
  1. 1,2,3
  2. 4,5,6
  3. 7,8,9

  1. import wordcloud
  2. c = wordcloud.WordCloud() # 1. 配置对象参数
  3. c.generate("wordcloud by Python") # 2. 加载词云文本
  4. c.to_file("pywordcloud.png") # 3. 输出词云文件

image.png

  1. import wordcloud
  2. txt = "life is short, you need python"
  3. w = wordcloud.WordCloud(background_color="white")
  4. w.generate(txt)
  5. w.to_file("pywcloud.png")

image.png

  1. import jieba
  2. import wordcloud
  3. txt = "程序设计语言是计算机能够理解和\
  4. 识别用户操作意图的一种交互体系,它按照\
  5. 特定规则组织计算机指令,使计算机能够自\
  6. 动进行各种运算处理。"
  7. w = wordcloud.WordCloud(width=1000, font_path="msyh.ttc", height=700)
  8. w.generate(" ".join(jieba.lcut(txt))) # 中文想要先分词并组成空格字符串
  9. w.to_file("pywcloud.png")

image.png

  1. import jieba
  2. import wordcloud
  3. f = open("新时代中国特色社会主义.txt", "r", encoding="utf-8")
  4. t = f.read()
  5. f.close()
  6. ls = jieba.lcut(t)
  7. txt = " ".join(ls)
  8. w = wordcloud.WordCloud(
  9. width=1000, height=700, background_color="white", font_path="msyh.ttc"
  10. )
  11. w.generate(txt)
  12. w.to_file("grwordcloud.png")

grwordcloud.png


  1. import jieba
  2. import wordcloud
  3. f = open("关于实施乡村振兴战略的意见.txt", "r", encoding="utf-8")
  4. t = f.read()
  5. f.close()
  6. ls = jieba.lcut(t)
  7. txt = " ".join(ls)
  8. w = wordcloud.WordCloud(
  9. width=1000, height=700, background_color="white", font_path="msyh.ttc"
  10. )
  11. w.generate(txt)
  12. w.to_file("grwordcloud.png")

grwordcloud.png


  1. import jieba
  2. import wordcloud
  3. f = open("新时代中国特色社会主义.txt", "r", encoding="utf-8")
  4. t = f.read()
  5. f.close()
  6. ls = jieba.lcut(t)
  7. txt = " ".join(ls)
  8. w = wordcloud.WordCloud(
  9. width=1000, height=700, background_color="white", font_path="msyh.ttc", max_words=15
  10. )
  11. w.generate(txt)
  12. w.to_file("grwordcloud.png")

grwordcloud.png

  1. import jieba
  2. import wordcloud
  3. f = open("关于实施乡村振兴战略的意见.txt", "r", encoding="utf-8")
  4. t = f.read()
  5. f.close()
  6. ls = jieba.lcut(t)
  7. txt = " ".join(ls)
  8. w = wordcloud.WordCloud(
  9. width=1000, height=700, background_color="white", font_path="msyh.ttc", max_words=15
  10. )
  11. w.generate(txt)
  12. w.to_file("grwordcloud.png")

grwordcloud.png


素材:

fivestart.png
chinamap.jpg

  1. import jieba
  2. import wordcloud
  3. import imageio
  4. mask = imageio.imread("fivestart.png")
  5. excludes = {}
  6. f = open("新时代中国特色社会主义.txt", "r", encoding="utf-8")
  7. t = f.read()
  8. f.close()
  9. ls = jieba.lcut(t)
  10. txt = " ".join(ls)
  11. w = wordcloud.WordCloud(
  12. width=1000, height=700, background_color="white", font_path="msyh.ttc", mask=mask
  13. )
  14. w.generate(txt)
  15. w.to_file("grwordcloudm.png")

grwordcloudm.png

  1. import jieba
  2. import wordcloud
  3. import imageio
  4. mask = imageio.imread("fivestart.png")
  5. excludes = {}
  6. f = open("关于实施乡村振兴战略的意见.txt", "r", encoding="utf-8")
  7. t = f.read()
  8. f.close()
  9. ls = jieba.lcut(t)
  10. txt = " ".join(ls)
  11. w = wordcloud.WordCloud(
  12. width=1000, height=700, background_color="white", font_path="msyh.ttc", mask=mask
  13. )
  14. w.generate(txt)
  15. w.to_file("grwordcloudm.png")

grwordcloudm.png

  1. import jieba
  2. import wordcloud
  3. from imageio import imread
  4. mask = imread("chinamap.jpg")
  5. excludes = {}
  6. f = open("新时代中国特色社会主义.txt", "r", encoding="utf-8")
  7. t = f.read()
  8. f.close()
  9. ls = jieba.lcut(t)
  10. txt = " ".join(ls)
  11. w = wordcloud.WordCloud(
  12. width=1000, height=700, background_color="white", font_path="msyh.ttc", mask=mask
  13. )
  14. w.generate(txt)
  15. w.to_file("grwordcloudm.png")

grwordcloudm.png

  1. import jieba
  2. import wordcloud
  3. import imageio
  4. mask = imageio.imread("chinamap.jpg")
  5. excludes = {}
  6. f = open("关于实施乡村振兴战略的意见.txt", "r", encoding="utf-8")
  7. t = f.read()
  8. f.close()
  9. ls = jieba.lcut(t)
  10. txt = " ".join(ls)
  11. w = wordcloud.WordCloud(
  12. width=1000, height=700, background_color="white", font_path="msyh.ttc", mask=mask
  13. )
  14. w.generate(txt)
  15. w.to_file("grwordcloudm.png")

grwordcloudm.png


image.png

  1. f = open("latex.log")
  2. s = 0
  3. for line in f:
  4. line = line.strip("\n")
  5. if len(line) == 0:
  6. continue
  7. s += 1
  8. print("共{}行".format(s)) # 共4951行

image.png

  1. f = open("latex.log")
  2. cc = 0
  3. # 初始化一个记录 26 个字母出现次数的字典
  4. d = {}
  5. for i in range(26):
  6. d[chr(ord("a") + i)] = 0
  7. for line in f:
  8. for c in line:
  9. d[c] = d.get(c, 0) + 1
  10. cc += 1
  11. print("共{}字符".format(cc), end="")
  12. for i in range(26):
  13. if d[chr(ord("a") + i)] != 0:
  14. print(",{}:{}".format(chr(ord("a") + i), d[chr(ord("a") + i)]), end="")
  15. """
  16. 共244019字符,a:9620,b:525,c:8769,d:1046,e:15585,f:8653,g:4548,h:8882,i:17587,j:62,k:122,l:9090,m:736,n:25730,o:13812,p:961,q:132,r:13755,s:12948,t:14049,u:4850,v:294,w:427,x:276,y:359,z:4
  17. """

image.png

  1. f = open("latex.log")
  2. ls = f.readlines()
  3. s = set(ls)
  4. for i in s:
  5. ls.remove(i)
  6. t = set(ls)
  7. print("共{}独特行".format(len(s) - len(t))) # 共291独特行

image.png

  1. 1,2,3,4,5,6,7
  2. 8, 3, 2, 7, 1, 4, 6, 5
  3. 6, 1, 3, 8, 5, 7, 4, 2
  4. 'a','b','c','x','y','z','i','j','k'
  5. 'k', 'b', 'j', 'c', 'i', 'y', 'z', 'a', 'x'
  6. 'z', 'c', 'b', 'a', 'k', 'i', 'j', 'y', 'x'
  7. 'a', 'y', 'b', 'x', 'z', 'c', 'i', 'j', 'k'
  8. 5, 2, 4, 7, 1, 6, 8, 3
  1. f = open("data.csv")
  2. for line in f:
  3. line = line.strip("\n")
  4. ls = line.split(",")
  5. ls = ls[::-1]
  6. print(",".join(ls))
  7. f.close()
  8. """
  9. 7,6,5,4,3,2,1
  10. 5, 6, 4, 1, 7, 2, 3,8
  11. 2, 4, 7, 5, 8, 3, 1,6
  12. 'k','j','i','z','y','x','c','b','a'
  13. 'x', 'a', 'z', 'y', 'i', 'c', 'j', 'b','k'
  14. 'x', 'y', 'j', 'i', 'k', 'a', 'b', 'c','z'
  15. 'k', 'j', 'i', 'c', 'z', 'x', 'b', 'y','a'
  16. 3, 8, 6, 1, 7, 4, 2,5
  17. """

image.png

  1. 1,2,3,4,5,6,7
  2. 8, 3, 2, 7, 1, 4, 6, 5
  3. 6, 1, 3, 8, 5, 7, 4, 2
  4. 'a','b','c','x','y','z','i','j','k'
  5. 'k', 'b', 'j', 'c', 'i', 'y', 'z', 'a', 'x'
  6. 'z', 'c', 'b', 'a', 'k', 'i', 'j', 'y', 'x'
  7. 'a', 'y', 'b', 'x', 'z', 'c', 'i', 'j', 'k'
  8. 5, 2, 4, 7, 1, 6, 8, 3
  1. f = open("data.csv")
  2. s = f.read()
  3. s = s.replace(" ", "")
  4. print(s)
  5. f.close()
  6. """
  7. 1,2,3,4,5,6,7
  8. 8,3,2,7,1,4,6,5
  9. 6,1,3,8,5,7,4,2
  10. 'a','b','c','x','y','z','i','j','k'
  11. 'k','b','j','c','i','y','z','a','x'
  12. 'z','c','b','a','k','i','j','y','x'
  13. 'a','y','b','x','z','c','i','j','k'
  14. 5,2,4,7,1,6,8,3
  15. """

导学

前课复习

[8.1.1]--前课复习(1).mp4 (51.18MB).mp4%22%2C%22size%22%3A53669945%2C%22taskId%22%3A%22ua0665a35-ddb2-4ad6-99fa-4d8d3aa1795%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481002465-bd27a895-b1ec-4afe-aa08-afe4736d789b.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22ouWnq%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#ouWnq)

本课概要

[8.1.2]--本课概要(1).mp4 (37.28MB).mp4%22%2C%22size%22%3A39090251%2C%22taskId%22%3A%22u68094013-f516-46c3-9d8c-05da6e608d4%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481002466-d5f6005e-df85-495f-980b-d786ea06fef6.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22E2ENp%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#E2ENp) 格式化:

  • 字符串格式化:将字符串按照一定规格和式样进行规范 "{ }{ }{ }".format()
  • 数字格式化:将一组数据按照一定规格和式样进行规范:表示、存储、运算等

文件的使用

单元开篇

[8.2.1]--单元开篇(1).mp4 (6.25MB).mp4%22%2C%22size%22%3A6553678%2C%22taskId%22%3A%22u5435fad7-8eb8-4be0-922b-d298ac052f5%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481012096-1329864e-987c-4397-a24a-52b83e4737ca.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22kzTXR%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#kzTXR)

文件的类型

[8.2.2]--文件的类型(1).mp4 (96.9MB).mp4%22%2C%22size%22%3A101602096%2C%22taskId%22%3A%22ua61d7138-0177-4717-9729-2902f25fe67%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481012094-f2d27911-6f3a-4373-a9a9-7a953730c454.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22oZlAw%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#oZlAw)

文件是数据的抽象和集合

  • 文件是存储在辅助存储器上的数据序列
  • 文件是数据存储的一种形式
  • 文件展现形态:文件文本和二进制文件

文本文件 VS 二进制文件

  • 文本文件和二进制文件只是文件的展示方式
  • 本质上,所有文件都是二进制形式存储
  • 形式上,所有文件采用两种方式展示

文本文件:

  • 由单一特定编码组成的文件,如 UTF-8 编码
  • 由于存在编码,也被看成是存储着的长字符串
  • 适用于例如:.txt 文件、.py 文件等

二进制文件:

  • 直接由比特 0 和 1 组成,没有统一字符编码
  • 一般存在二进制 0 和 1 的组织结构,即文件格式
  • 适用于例如:.png 文件、.avi 文件等
  1. "中国是一个伟大的国家"
  1. tf = open("f.txt", "rt")
  2. print(tf.readline()) # "中国是一个伟大的国家"
  3. tf.close()
  1. tf = open("f.txt", "rb")
  2. print(tf.readline()) # b'"\xe4\xb8\xad\xe5\x9b\xbd\xe6\x98\xaf\xe4\xb8\x80\xe4\xb8\xaa\xe4\xbc\x9f\xe5\xa4\xa7\xe7\x9a\x84\xe5\x9b\xbd\xe5\xae\xb6"'
  3. tf.close()

文件的打开和关闭

[8.2.3]--文件的打开和关闭(1).mp4 (153.45MB).mp4%22%2C%22size%22%3A160906872%2C%22taskId%22%3A%22uf3fd705d-f2ac-4ffc-a801-b19be408394%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481012119-299b3d83-7127-4b92-b8e9-c5061476ef70.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22aD9lt%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#aD9lt) 文件处理的步骤:

  1. 打开
  2. 操作
  3. 关闭

文件的两个状态:

  1. 存储状态
  2. 占用状态

在占用状态下,一个程序可以对文件进行唯一的、排他的进行处理,以免出现多个程序同时处理一个文件导致冲突的问题。

image.png

image.png

image.png

image.png

  1. f = open("f.txt") # 文本形式、只读模式、默认值
  2. f = open("f.txt", "rt") # 文本形式、只读模式、同默认值
  3. f = open("f.txt", "w") # 文本形式、覆盖写模式
  4. f = open("f.txt", "a+") # 文本形式、追加写模式+ 读文件
  5. f = open("f.txt", "a") # 文本形式、追加写模式(不能读)
  6. f = open("f.txt", "x") # 文本形式、创建写模式
  7. f = open("f.txt", "b") # 二进制形式、只读模式
  8. f = open("f.txt", "wb") # 二进制形式、覆盖写模式

image.png


回顾上一节的两个读 f.txt 文件的小 demo:

image.png

  1. tf = open("f.txt", "rt")
  2. print(tf.readline()) # "中国是一个伟大的国家"
  3. tf.close()
  1. tf = open("f.txt", "rb")
  2. print(tf.readline()) # b'"\xe4\xb8\xad\xe5\x9b\xbd\xe6\x98\xaf\xe4\xb8\x80\xe4\xb8\xaa\xe4\xbc\x9f\xe5\xa4\xa7\xe7\x9a\x84\xe5\x9b\xbd\xe5\xae\xb6"'
  3. tf.close()

文件内容的读取

[8.2.4]--文件内容的读取(1).mp4 (95.45MB).mp4%22%2C%22size%22%3A100088590%2C%22taskId%22%3A%22udd880086-9bdf-4ecd-8c97-fe54868483f%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481012120-7d13077b-6eb1-4e77-9718-2ff2fd9ca108.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22vIH9a%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#vIH9a) image.png

image.png

  1. fname = input("请输入要打开的文件名称:")
  2. fo = open(fname, 'r')
  3. # 一次读入,统一处理
  4. txt = fo.read()
  5. fo.close()
  1. fname = input("请输入要打开的文件名称:")
  2. fo = open(fname, 'r')
  3. # 按数量读入,逐步处理
  4. txt = fo.read(2)
  5. while txt != "":
  6. txt = fo.read(2)
  7. fo.close()
  1. fname = input("请输入要打开的文件名称:")
  2. fo = open(fname, 'r')
  3. # 一次读入,分行处理
  4. for line in fo.readline():
  5. print(line)
  6. fo.close()
  1. fname = input("请输入要打开的文件名称:")
  2. fo = open(fname, 'r')
  3. # 分行读入,逐行处理
  4. for line in fo:
  5. print(line)
  6. fo.close()

数据的文件写入

[8.2.5]--数据的文件写入(1).mp4 (104.9MB).mp4%22%2C%22size%22%3A109999511%2C%22taskId%22%3A%22u257e16bc-cf59-485b-943b-8b424825238%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481012123-290541fe-0109-4650-8a54-085fe829717f.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22lDO8g%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#lDO8g) image.png

<f>.writelines(lines) 将列表中的元素拼接写入到文件 <f> 中,这种做法写入的效果并不会自动完成换行,每一个列表元素会挨着上一个的结尾写入文件。

image.png

注意:文件指针

思考:请问为什么示例 1 打印的结果为空,而示例 2 可以将 output.txt 文件中的内容打印出来?

  1. fo = open("output.txt", "w+")
  2. ls = ["中国", "法国", "美国"]
  3. fo.writelines(ls)
  4. # fo.seek(0)
  5. for line in fo:
  6. print(line)
  7. fo.close()
  8. '''
  9. 输出结果为空
  10. '''
  1. fo = open("output.txt", "w+")
  2. ls = ["中国", "法国", "美国"]
  3. fo.writelines(ls)
  4. fo.seek(0)
  5. for line in fo:
  6. print(line)
  7. fo.close()
  8. '''
  9. 中国法国美国
  10. '''

image.png

这两个示例都是在操作同一个文件output.txt,并向文件中写入一个字符串列表,然后尝试读取并打印出文件中的内容。

在示例 1 中,你直接在写入后进行了读取,但是没有先设置文件的读取位置(即文件指针),默认文件指针停在文件尾部。当你尝试读取时,因为你已经在文件的尾部,没有更多的内容可以读取,所以输出结果为空。

7. 文件和数据格式化 - 图38

在示例 2 中,写入后,你通过调用**fo.seek(0)**设置了文件的读取位置回到文件的开始位置。然后你读取并打印出文件的内容,这时因为文件指针在文件的开始位置,所以你能读取并打印出文件中的内容,输出中国法国美国

7. 文件和数据格式化 - 图39

fo.seek(offset)函数用于移动文件读写指针到指定位置,offset表示要移动的字节数,0 表示文件的开头。

所以当你打开文件时,既需要读又需要写,并且希望在写入后立即读取,需要记住设置文件的读取位置,这样才能按照你的期望读取到文件的内容。

单元小结

[8.2.6]--单元小结(1).mp4 (18.05MB).mp4%22%2C%22size%22%3A18925447%2C%22taskId%22%3A%22udbd828ac-5f65-4ea5-8766-617fe44341f%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481018750-86081fe1-3173-4d8c-b7f7-07acd49ff52b.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22tW8Nm%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#tW8Nm)

  • 文件的使用方式:打开-操作-关闭
  • 文本文件&二进制文件,open( , ).close()
  • 文件内容的读取:.read() .readline() .readlines()
  • 数据的文件写入:.write() .writelines() .seek()

实例11: 自动轨迹绘制

问题分析

[8.3.1]--自动轨迹绘制问题分析(1).mp4 (24.9MB).mp4%22%2C%22size%22%3A26113378%2C%22taskId%22%3A%22ud70c77c3-f0e3-4d9e-9bdd-80d7932d4e1%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481032970-abb00f8b-5a2b-4c5c-bc75-313411392759.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22A4zaV%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#A4zaV)

实例讲解

[8.3.2]--自动轨迹绘制实例讲解(1).mp4 (158.3MB).mp4%22%2C%22size%22%3A165992749%2C%22taskId%22%3A%22u3eedd0c6-dc56-4c7d-82d4-aa200079c3a%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481049713-ab4a6ade-6a9b-4f1b-87e7-2bf6f408c25c.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22kvtBt%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#kvtBt)

  1. 300,0,144,1,0,0
  2. 300,0,144,0,1,0
  3. 300,0,144,0,0,1
  4. 300,0,144,1,1,0
  5. 300,0,108,0,1,1
  6. 184,0,72,1,0,1
  7. 184,0,72,0,0,0
  8. 184,0,72,0,0,0
  9. 184,0,72,0,0,0
  10. 184,1,72,1,0,1
  11. 184,1,72,0,0,0
  12. 184,1,72,0,0,0
  13. 184,1,72,0,0,0
  14. 184,1,72,0,0,0
  15. 184,1,720,0,0,0
  1. import turtle as t
  2. t.title("自动轨迹绘制")
  3. t.setup(800, 600, 0, 0)
  4. t.pencolor("red")
  5. t.pensize(5)
  6. # 数据读取
  7. datals = []
  8. f = open("data.txt")
  9. for line in f:
  10. print('line:', line)
  11. line = line.replace("\n", "")
  12. datals.append(list(map(eval, line.split(","))))
  13. print('datals:', datals)
  14. f.close()
  15. # 自动绘制
  16. for i in range(len(datals)):
  17. t.pencolor(datals[i][3], datals[i][4], datals[i][5])
  18. t.fd(datals[i][0])
  19. if datals[i][1]:
  20. t.rt(datals[i][2])
  21. else:
  22. t.lt(datals[i][2])
  23. if i == (len(datals) - 1):
  24. t.done()
  25. """
  26. line: 300,0,144,1,0,0
  27. line: 300,0,144,0,1,0
  28. line: 300,0,144,0,0,1
  29. line: 300,0,144,1,1,0
  30. line: 300,0,108,0,1,1
  31. line: 184,0,72,1,0,1
  32. line: 184,0,72,0,0,0
  33. line: 184,0,72,0,0,0
  34. line: 184,0,72,0,0,0
  35. line: 184,1,72,1,0,1
  36. line: 184,1,72,0,0,0
  37. line: 184,1,72,0,0,0
  38. line: 184,1,72,0,0,0
  39. line: 184,1,72,0,0,0
  40. line: 184,1,720,0,0,0
  41. datals: [
  42. [300, 0, 144, 1, 0, 0],
  43. [300, 0, 144, 0, 1, 0],
  44. [300, 0, 144, 0, 0, 1],
  45. [300, 0, 144, 1, 1, 0],
  46. [300, 0, 108, 0, 1, 1],
  47. [184, 0, 72, 1, 0, 1],
  48. [184, 0, 72, 0, 0, 0],
  49. [184, 0, 72, 0, 0, 0],
  50. [184, 0, 72, 0, 0, 0],
  51. [184, 1, 72, 1, 0, 1],
  52. [184, 1, 72, 0, 0, 0],
  53. [184, 1, 72, 0, 0, 0],
  54. [184, 1, 72, 0, 0, 0],
  55. [184, 1, 72, 0, 0, 0],
  56. [184, 1, 720, 0, 0, 0]
  57. ]
  58. """

image.png

举一反三

[8.3.3]--自动轨迹绘制举一反三(1).mp4 (62.14MB).mp4%22%2C%22size%22%3A65157950%2C%22taskId%22%3A%22u65ad1779-22e9-4f76-aede-dd408127865%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481056080-40826c26-7cb0-40f5-9480-86ef710a1683.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22SuXzr%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#SuXzr)

  • 自动化思维:数据和功能分离,数据驱动的自动运行
  • 接口化设计:格式化设计接口,清晰明了
  • 二维数据应用:应用维度组织数据,二维数据最常用

一维数据的格式化和处理

单元开篇

[8.4.1]--单元开篇(1).mp4 (8.41MB).mp4%22%2C%22size%22%3A8823308%2C%22taskId%22%3A%22u8e7d570d-b1df-4fd0-914e-0aec339e60e%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481056083-2549b5c1-87b4-4df3-ad7f-30bcc037407d.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22gsq4u%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#gsq4u)

数据组织的维度

[8.4.2]--数据组织的维度(1).mp4 (67.66MB).mp4%22%2C%22size%22%3A70946639%2C%22taskId%22%3A%22ud456a84e-c6da-43fd-81aa-c7f9e7061dc%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481057344-65f27f19-882e-4309-a5d2-2c5e076511dd.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22wW9rs%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#wW9rs) image.png

image.png

一维数据:由对等关系的有序或无序数据构成,采用线性方式组织

在 Python 中,一维数据对应的数据类型:

  • 列表
  • 数组
  • 集合
  • ……

二维数据:由多个一维数据构成,是一维数据的组合形式

image.png

多维数据:由一维或二维数据在新维度上扩展形成

image.png

高纬数据:仅利用最基本的二元关系展示数据间的复杂结构

image.png

数据的操作周期:

image.png

一维数据的表示

[8.4.3]--一维数据的表示(1).mp4 (15MB).mp4%22%2C%22size%22%3A15727873%2C%22taskId%22%3A%22ufef68f59-43c9-4882-af8f-5eb917a6554%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481063830-46529d10-2514-430e-b165-a38c709deb26.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22x0viD%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#x0viD) 如果数据间有序:使用列表类型

  1. ls = [3.1398, 3.1349, 3.1376]
  • 列表类型可以表达一维有序数据
  • for 循环可以遍历数据,进而对每个数据进行处理

如果数据间无序:使用集合类型

  1. st = {3.1398, 3.1349, 3.1376}
  • 集合类型可以表达一维无序数据
  • for 循环可以遍历数据,进而对每个数据进行处理

一维数据的存储

[8.4.4]--一维数据的存储(1).mp4 (30.02MB).mp4%22%2C%22size%22%3A31478602%2C%22taskId%22%3A%22u18932164-f320-4b83-b567-078c163d9b2%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481074878-519e7d8f-b6b4-46f3-b6e3-3832b5848010.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22udUSZ%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#udUSZ) image.png
image.png
image.png

一维数据的处理

[8.4.5]--一维数据的处理(1).mp4 (44.73MB).mp4%22%2C%22size%22%3A46903463%2C%22taskId%22%3A%22u374197e6-aa25-40a4-a412-c485e44133f%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481075824-8ce2e4cf-231c-412b-8683-5a39b333e93a.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22XA2KD%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#XA2KD) image.png


从空格分隔的文件中读入数据

  1. 中国 美国 日本 德国 法国 英国 意大利
  1. filename = "1.txt"
  2. f = open(filename)
  3. txt = f.read()
  4. ls = txt.split()
  5. print('ls:', ls) # ls: ['中国', '美国', '日本', '德国', '法国', '英国', '意大利']
  6. f.close()

从特殊符号分隔的文件中读入数据

  1. 中国$美国$日本$德国$法国$英国$意大利
  1. filename = "1.txt"
  2. f = open(filename)
  3. txt = f.read()
  4. ls = txt.split('$')
  5. print('ls:', ls) # ls: ['中国', '美国', '日本', '德国', '法国', '英国', '意大利']
  6. f.close()

采用空格分隔方式将数据写入文件

  1. ls = ["中国", "美国", "日本"]
  2. fname = "1.txt"
  3. f = open(fname, "w")
  4. f.write(" ".join(ls))
  5. f.close()
  1. 中国 美国 日本

采用特殊分隔方式将数据写入文件

  1. ls = ["中国", "美国", "日本"]
  2. fname = "1.txt"
  3. f = open(fname, "w")
  4. f.write("$".join(ls))
  5. f.close()
  1. 中国$美国$日本

单元小结

[8.4.6]--单元小结(1).mp4 (12.47MB).mp4%22%2C%22size%22%3A13071662%2C%22taskId%22%3A%22u9c497d66-ae8b-42aa-ad71-880aea69c1c%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481084230-d132becd-80fb-4322-aa8c-30c507ea371d.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22CuZlO%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#CuZlO)

  • 数据的维度:一维、二维、多维、高维
  • 一维数据的表示:列表类型(有序)和集合类型(无序)
  • 一维数据的存储:空格分隔、逗号分隔、特殊符号分隔
  • 一维数据的处理:字符串方法 .split() 和 .join()

二维数据的格式化和处理

单元开篇

[8.5.1]--单元开篇(1).mp4 (9.04MB).mp4%22%2C%22size%22%3A9484313%2C%22taskId%22%3A%22u9984d026-c1a0-493f-810b-b0c4fb4aec6%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481088352-99c7e41f-c16c-47b7-9866-d2c3563d73b0.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22vJOI4%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#vJOI4)

二维数据的表示

[8.5.2]--二维数据的表示(1).mp4 (35.79MB).mp4%22%2C%22size%22%3A37525904%2C%22taskId%22%3A%22u4ac984ba-a020-40e8-9d10-2ac1d551259%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481091232-32944cdf-f128-4233-8157-192149bda9f7.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22th7mB%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#th7mB) image.png

二维数据的遍历

  • 使用两层 for 循环遍历每个元素
  • 外层列表中每个元素可以对应一行,也可以对应一列

数据维度是数据的组织形式

image.png

CSV 格式与二维数据存储

[8.5.3]--CSV格式与二维数据的存储(1).mp4 (81.75MB).mp4%22%2C%22size%22%3A85721527%2C%22taskId%22%3A%22u7d64a2d1-aefd-470a-8c97-e38aa790361%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481092557-6e4c8887-b79a-4f7a-afaf-1c913e998be0.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22DhmfH%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#DhmfH) CSV:Comma-Separated Values

逗号分隔的值

  • 国际通用的一、二维数据存储格式,一般 **.csv** 扩展名
  • 每行一个一维数据,采用逗号分隔,无空行
  • Excel 和一般编辑软件都可以读入或另存为 csv 文件
  • 如果某个元素缺失,逗号仍要保留
  • 二维数据的表头可以作为数据存储,也可以另行存储
  • 逗号为英文半角逗号,逗号与数据之间无额外空格

image.png


二维数据的存储

  1. 按行存
  2. 按列存
  • 按行存或者按列存都可以,具体由程序决定
  • 一般索引习惯:ls[row][column],先行后列
  • 根据一般习惯,外层列表每个元素是一行,按行存

二维数据的处理

[8.5.4]--二维数据的处理(1).mp4 (39.27MB).mp4%22%2C%22size%22%3A41174244%2C%22taskId%22%3A%22u9cdb806b-f38a-4337-9c72-5ffe12e4207%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481093968-46af58dc-34d2-41b1-89f5-967b9309c194.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22zHjxc%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#zHjxc) 从 CSV 格式的文件中读入数据

  1. 城市,环比,同比,定基
  2. 北京,101.5,120.7,121.4
  3. 上海,101.2,127.3,127.8
  4. 广州,101.3,119.4,120.0
  5. 深圳,102.0,140.0,145.5
  6. 沈阳,100.0,101.4,101.6
  1. fname = "1.csv"
  2. fo = open(fname)
  3. ls = []
  4. for line in fo:
  5. line = line.replace("\n", "")
  6. ls.append(line.split(","))
  7. fo.close()
  8. print(ls)
  9. """
  10. [
  11. ["城市", "环比", "同比", "定基"],
  12. ["北京", "101.5", "120.7", "121.4"],
  13. ["上海", "101.2", "127.3", "127.8"],
  14. ["广州", "101.3", "119.4", "120.0"],
  15. ["深圳", "102.0", "140.0", "145.5"],
  16. ["沈阳", "100.0", "101.4", "101.6"],
  17. ]
  18. """

将数据写入 CSV 格式的文件

  1. fname = "output.csv"
  2. ls = [["1", "2", "3"], ["4", "5", "6"], ["7", "8", "9"]] # 二维列表
  3. f = open(fname, "w")
  4. for item in ls:
  5. f.write(",".join(item) + "\n")
  6. f.close()
  1. 1,2,3
  2. 4,5,6
  3. 7,8,9

单元小结

[8.5.5]--单元小结(1).mp4 (18.59MB).mp4%22%2C%22size%22%3A19491036%2C%22taskId%22%3A%22u8be7f0e2-9a04-4e03-95cd-a7ff53c44c5%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481095097-a895aca6-89ca-4971-b6eb-f220de98db35.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22wU5iK%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#wU5iK)

  • 二维数据的表示:列表类型,其中每个元素也是一个列表
  • CSV 格式:逗号分隔表示一维,按行分隔表示二维
  • 二维数据的处理:for 循环.split().join()

模块6: wordcloud 库的使用

:::warning 温 馨 提 示

微软雅黑字体压缩包:msyh.ttc.zip

在教程提供的一些生成词云的示例中,需要用到 msyh.ttc 字体,若程序找不到这个字体文件,那么运行时会报错。

如果示例在运行时出现找不到字体的报错,需要先下载字体文件,然后把文件丢到当前程序所在目录即可。 :::

wordcloud 库基本介绍

[8.6.1]--wordcloud库基本介绍(1).mp4 (15.83MB).mp4%22%2C%22size%22%3A16601078%2C%22taskId%22%3A%22u38092530-5db2-476f-bf8f-3f7d3d26cb7%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481107554-9c0ed8f1-9546-4035-a83d-96e1bf8c41a1.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22khR4T%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#khR4T)

wordcloud 是优秀的词云展示第三方库

词云以词语为基本单位,更加直观和艺术地展示文本

  1. pip install wordcloud

wordcloud 库使用说明

[8.6.2]--wordcloud库使用说明(1).mp4 (203.96MB).mp4%22%2C%22size%22%3A213870062%2C%22taskId%22%3A%22u3c37ed4b-03cd-4b1c-a444-409dd23d1a6%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481108223-2b98452b-6d01-4c4f-b58d-8546418d5c96.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22fGVSJ%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#fGVSJ) wordcloud 库把词云当作一个 WordCloud 对象

  • wordcloud.WordCloud() 代表一个文本对应的词云
  • 可以根据文本中词语出现的频率等参数绘制词云
  • 词云的绘制形状、尺寸和颜色都可以设定

w = wordcloud.WordCloud()

  • 以 WordCloud 对象为基础
  • 配置参数、加载文本、输出文件

wordcloud 库常规方法

image.png

使用 wordcloud 库的 3 个步骤:

  1. 配置对象参数
  2. 加载词云文本
  3. 输出词云文件
  1. import wordcloud
  2. c = wordcloud.WordCloud() # 1. 配置对象参数
  3. c.generate("wordcloud by Python") # 2. 加载词云文本
  4. c.to_file("pywordcloud.png") # 3. 输出词云文件

pywordcloud.png

image.png


配置对象参数

w = wordcloud.WordCloud(<参数>)

image.png
image.png
image.png
image.png

  1. import wordcloud
  2. txt = "life is short, you need python"
  3. w = wordcloud.WordCloud(background_color="white")
  4. w.generate(txt)
  5. w.to_file("pywcloud.png")

pywcloud.png

  1. import jieba
  2. import wordcloud
  3. txt = "程序设计语言是计算机能够理解和\
  4. 识别用户操作意图的一种交互体系,它按照\
  5. 特定规则组织计算机指令,使计算机能够自\
  6. 动进行各种运算处理。"
  7. w = wordcloud.WordCloud(width=1000, font_path="msyh.ttc", height=700)
  8. w.generate(" ".join(jieba.lcut(txt))) # 中文想要先分词并组成空格字符串
  9. w.to_file("pywcloud.png")

pywcloud.png

实例12: 政府工作报告词云

问题分析

[8.7.1]--政府工作报告词云问题分析(1).mp4 (37.33MB).mp4%22%2C%22size%22%3A39144229%2C%22taskId%22%3A%22ub97fc1dd-8d11-4812-b751-2506f04c440%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481108913-741b4af7-ac7b-43d2-a6b5-2d92efae009e.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22tYG9Z%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#tYG9Z) image.png

image.png

https://python123.io/resources/pye/新时代中国特色社会主义.txt

image.png

https://python123.io/resources/pye/关于实施乡村振兴战略的意见.txt

实例讲解(上)

[8.7.2]--政府工作报告词云实例解析(上)(1).mp4 (99.34MB)(1).mp4%22%2C%22size%22%3A104164060%2C%22taskId%22%3A%22ue63d7a6b-1650-4061-9334-30fdf3d8005%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481111854-21bd14a2-884e-4036-9a70-148f73f9b46c.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22VrzMh%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#VrzMh)

  1. import jieba
  2. import wordcloud
  3. f = open("新时代中国特色社会主义.txt", "r", encoding="utf-8")
  4. t = f.read()
  5. f.close()
  6. ls = jieba.lcut(t)
  7. txt = " ".join(ls)
  8. w = wordcloud.WordCloud(
  9. width=1000, height=700, background_color="white", font_path="msyh.ttc"
  10. )
  11. w.generate(txt)
  12. w.to_file("grwordcloud.png")

grwordcloud.png


  1. import jieba
  2. import wordcloud
  3. f = open("关于实施乡村振兴战略的意见.txt", "r", encoding="utf-8")
  4. t = f.read()
  5. f.close()
  6. ls = jieba.lcut(t)
  7. txt = " ".join(ls)
  8. w = wordcloud.WordCloud(
  9. width=1000, height=700, background_color="white", font_path="msyh.ttc"
  10. )
  11. w.generate(txt)
  12. w.to_file("grwordcloud.png")

grwordcloud.png


  1. import jieba
  2. import wordcloud
  3. f = open("新时代中国特色社会主义.txt", "r", encoding="utf-8")
  4. t = f.read()
  5. f.close()
  6. ls = jieba.lcut(t)
  7. txt = " ".join(ls)
  8. w = wordcloud.WordCloud(
  9. width=1000, height=700, background_color="white", font_path="msyh.ttc", max_words=15
  10. )
  11. w.generate(txt)
  12. w.to_file("grwordcloud.png")

grwordcloud.png

  1. import jieba
  2. import wordcloud
  3. f = open("关于实施乡村振兴战略的意见.txt", "r", encoding="utf-8")
  4. t = f.read()
  5. f.close()
  6. ls = jieba.lcut(t)
  7. txt = " ".join(ls)
  8. w = wordcloud.WordCloud(
  9. width=1000, height=700, background_color="white", font_path="msyh.ttc", max_words=15
  10. )
  11. w.generate(txt)
  12. w.to_file("grwordcloud.png")

grwordcloud.png

实例讲解(下)

[8.7.3]--政府工作报告词云实例解析(下)(1).mp4 (23.61MB)(1).mp4%22%2C%22size%22%3A24756949%2C%22taskId%22%3A%22u682055b5-4d01-4f79-b79b-88b7e43310e%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481117225-ef9dcd37-0814-42fa-ba64-447d7828c148.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22wY5ME%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#wY5ME) 素材:

fivestart.png
chinamap.jpg

  1. import jieba
  2. import wordcloud
  3. import imageio
  4. mask = imageio.imread("fivestart.png")
  5. excludes = {}
  6. f = open("新时代中国特色社会主义.txt", "r", encoding="utf-8")
  7. t = f.read()
  8. f.close()
  9. ls = jieba.lcut(t)
  10. txt = " ".join(ls)
  11. w = wordcloud.WordCloud(
  12. width=1000, height=700, background_color="white", font_path="msyh.ttc", mask=mask
  13. )
  14. w.generate(txt)
  15. w.to_file("grwordcloudm.png")

grwordcloudm.png

  1. import jieba
  2. import wordcloud
  3. import imageio
  4. mask = imageio.imread("fivestart.png")
  5. excludes = {}
  6. f = open("关于实施乡村振兴战略的意见.txt", "r", encoding="utf-8")
  7. t = f.read()
  8. f.close()
  9. ls = jieba.lcut(t)
  10. txt = " ".join(ls)
  11. w = wordcloud.WordCloud(
  12. width=1000, height=700, background_color="white", font_path="msyh.ttc", mask=mask
  13. )
  14. w.generate(txt)
  15. w.to_file("grwordcloudm.png")

grwordcloudm.png

  1. import jieba
  2. import wordcloud
  3. from imageio import imread
  4. mask = imread("chinamap.jpg")
  5. excludes = {}
  6. f = open("新时代中国特色社会主义.txt", "r", encoding="utf-8")
  7. t = f.read()
  8. f.close()
  9. ls = jieba.lcut(t)
  10. txt = " ".join(ls)
  11. w = wordcloud.WordCloud(
  12. width=1000, height=700, background_color="white", font_path="msyh.ttc", mask=mask
  13. )
  14. w.generate(txt)
  15. w.to_file("grwordcloudm.png")

grwordcloudm.png

  1. import jieba
  2. import wordcloud
  3. import imageio
  4. mask = imageio.imread("chinamap.jpg")
  5. excludes = {}
  6. f = open("关于实施乡村振兴战略的意见.txt", "r", encoding="utf-8")
  7. t = f.read()
  8. f.close()
  9. ls = jieba.lcut(t)
  10. txt = " ".join(ls)
  11. w = wordcloud.WordCloud(
  12. width=1000, height=700, background_color="white", font_path="msyh.ttc", mask=mask
  13. )
  14. w.generate(txt)
  15. w.to_file("grwordcloudm.png")

grwordcloudm.png

举一反三

[8.7.4]--政府工作报告词云举一反三(1).mp4 (29.73MB).mp4%22%2C%22size%22%3A31176329%2C%22taskId%22%3A%22u4e29068d-e49d-4232-95da-6631f8b9eaa%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481125150-6231559a-6b2a-42da-822d-a48c419b0226.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22d1Euf%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#d1Euf)

作业与练习

[8.8.1]--作业与练习(1).mp4 (5.2MB).mp4%22%2C%22size%22%3A5450168%2C%22taskId%22%3A%22u58afed12-6c93-42f6-9a81-aca364dc44c%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688481126082-77e139af-c325-4cc8-9c66-72e0b95e44d9.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22OkpUt%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#OkpUt)

文件行数

image.png

附件:latex.log

  1. f = open("latex.log")
  2. s = 0
  3. for line in f:
  4. line = line.strip("\n")
  5. if len(line) == 0:
  6. continue
  7. s += 1
  8. print("共{}行".format(s)) # 共4951行

需要注意:for line in f 方式获得的每行内容(在变量line中)包含换行符,所以,要通过 strip() 函数去掉换行符后再进行统计。这里,空行指没有字符的行。

文件字符分布

image.png

附件:latex.log

  1. f = open("latex.log")
  2. cc = 0
  3. # 初始化一个记录 26 个字母出现次数的字典
  4. d = {}
  5. for i in range(26):
  6. d[chr(ord("a") + i)] = 0
  7. for line in f:
  8. for c in line:
  9. d[c] = d.get(c, 0) + 1
  10. cc += 1
  11. print("共{}字符".format(cc), end="")
  12. for i in range(26):
  13. if d[chr(ord("a") + i)] != 0:
  14. print(",{}:{}".format(chr(ord("a") + i), d[chr(ord("a") + i)]), end="")
  15. """
  16. 共244019字符,a:9620,b:525,c:8769,d:1046,e:15585,f:8653,g:4548,h:8882,i:17587,j:62,k:122,l:9090,m:736,n:25730,o:13812,p:961,q:132,r:13755,s:12948,t:14049,u:4850,v:294,w:427,x:276,y:359,z:4
  17. """

使用 ord(‘a’)+i 配合 range()函数 可以遍历一个连续的字符表。

文件独特行数

image.png

附件:latex.log

  1. f = open("latex.log")
  2. ls = f.readlines()
  3. s = set(ls)
  4. for i in s:
  5. ls.remove(i)
  6. t = set(ls)
  7. print("共{}独特行".format(len(s) - len(t))) # 共291独特行

记住:如果需要”去重”功能,请使用集合类型。

**ls.remove()** 可以去掉某一个元素,如果该行是独特行,去掉该元素后将不在集合 t 中出现

CSV 格式列变换

附件:data.csv

  1. 1,2,3,4,5,6,7
  2. 8, 3, 2, 7, 1, 4, 6, 5
  3. 6, 1, 3, 8, 5, 7, 4, 2
  4. 'a','b','c','x','y','z','i','j','k'
  5. 'k', 'b', 'j', 'c', 'i', 'y', 'z', 'a', 'x'
  6. 'z', 'c', 'b', 'a', 'k', 'i', 'j', 'y', 'x'
  7. 'a', 'y', 'b', 'x', 'z', 'c', 'i', 'j', 'k'
  8. 5, 2, 4, 7, 1, 6, 8, 3

image.png

  1. f = open("data.csv")
  2. for line in f:
  3. line = line.strip("\n")
  4. ls = line.split(",")
  5. ls = ls[::-1]
  6. print(",".join(ls))
  7. f.close()
  8. """
  9. 7,6,5,4,3,2,1
  10. 5, 6, 4, 1, 7, 2, 3,8
  11. 2, 4, 7, 5, 8, 3, 1,6
  12. 'k','j','i','z','y','x','c','b','a'
  13. 'x', 'a', 'z', 'y', 'i', 'c', 'j', 'b','k'
  14. 'x', 'y', 'j', 'i', 'k', 'a', 'b', 'c','z'
  15. 'k', 'j', 'i', 'c', 'z', 'x', 'b', 'y','a'
  16. 3, 8, 6, 1, 7, 4, 2,5
  17. """

CSV 格式数据清洗

附件:data.csv

  1. 1,2,3,4,5,6,7
  2. 8, 3, 2, 7, 1, 4, 6, 5
  3. 6, 1, 3, 8, 5, 7, 4, 2
  4. 'a','b','c','x','y','z','i','j','k'
  5. 'k', 'b', 'j', 'c', 'i', 'y', 'z', 'a', 'x'
  6. 'z', 'c', 'b', 'a', 'k', 'i', 'j', 'y', 'x'
  7. 'a', 'y', 'b', 'x', 'z', 'c', 'i', 'j', 'k'
  8. 5, 2, 4, 7, 1, 6, 8, 3

image.png

  1. f = open("data.csv")
  2. s = f.read()
  3. s = s.replace(" ", "")
  4. print(s)
  5. f.close()
  6. """
  7. 1,2,3,4,5,6,7
  8. 8,3,2,7,1,4,6,5
  9. 6,1,3,8,5,7,4,2
  10. 'a','b','c','x','y','z','i','j','k'
  11. 'k','b','j','c','i','y','z','a','x'
  12. 'z','c','b','a','k','i','j','y','x'
  13. 'a','y','b','x','z','c','i','j','k'
  14. 5,2,4,7,1,6,8,3
  15. """

该 CSV 文件的每个数据中不包含空格,因此,可以通过替换空格方式来清洗。如果数据中包含空格,该方法则不适用。

补充

计算机中的“文件”是什么?

在计算机科学中,文件是一个数据的存储单元。文件通常存储在某种形式的数据存储设备上,例如硬盘,SSD,USB 闪存驱动器,或网络存储设备。在大多数操作系统中,文件都是用于组织和存储数据的主要方式

文件可以包含任何类型的数据,包括文本、图像、音频和视频数据。文件通常以某种特定的文件格式存储,这个格式定义了文件的结构和内容。例如,.txt 文件是纯文本格式,.jpg 文件是一种图像格式,.mp3 文件是一种音频格式。

每个文件都有一个名字和一个路径,这可以帮助用户和程序找到和访问文件。文件名通常由文件的“基本名字”和一个“扩展名”组成,扩展名通常用来表示文件的格式。例如,在文件名“image.jpg”中,“image”是基本名字,“.jpg”是扩展名。

文件也有一些元数据,称为文件属性,这些属性包括文件的创建日期,最后修改日期,大小,以及文件的权限等等。

因此,简单来说,计算机中的“文件”就是存储在某种媒介上的一组数据,它有一个名称,一个位置(路径),一个格式,以及一些关于该文件的元数据

“文件后缀”的作用是什么?

文件后缀(也被称为文件扩展名)主要有两个作用:

  1. 识别文件类型:文件后缀可以帮助操作系统和应用程序确定文件的类型。例如,.docx 文件通常表示一个 Microsoft Word 文档,.jpg 或 .png 文件表示图像文件,.mp3 表示音频文件,.exe 表示可执行文件等等。这样,操作系统和应用程序就能知道如何正确地打开和处理这个文件。
  2. 关联默认应用程序:文件后缀还用于关联默认应用程序。操作系统通常会根据文件的扩展名来确定哪个程序被设置为默认打开该类型的文件。例如,如果你双击一个 .pdf 文件,系统就会打开与 .pdf 文件关联的默认应用程序(例如 Adobe Reader 或其他 PDF 阅读器)。

注意,虽然文件后缀通常可以表示文件的类型,但并不是绝对的。有的时候,文件的内容可能并不符合其后缀名。例如,如果你将一个图片文件的后缀从 .jpg 改为 .txt,那么操作系统会认为它是一个文本文件,尝试用文本编辑器打开它,但实际上它的内容仍然是图像数据。因此,在处理未知来源的文件时,不能仅仅依赖文件后缀来判断文件类型。

文件文件 VS 二进制文件

在计算机中,文件通常被分类为文本文件和二进制文件。这两种类型的文件有许多基本的区别:

文本文件

文本文件只包含字符的可打印表示,如字母,数字和符号,还包括一些不可打印的字符,如制表符、换行符和回车符。这些都是 ASCII 或 Unicode 字符集中的字符。你可以使用一个简单的文本编辑器(如 Notepad,Vim 或 Emacs)打开和阅读这些文件。最常见的文本文件扩展名包括 .txt, .json, .xml, .html, .css, .js, .md 等。

二进制文件

二进制文件包含了除文本字符之外的数据,或者说它们包含了特定格式的编码数据。这种文件类型通常包含一种或多种用于特定目的的数据类型,如图像、音频、视频或可执行程序等。如果你试图用文本编辑器打开一个二进制文件,你会看到一些无法解读的字符,因为它们并不一定属于人类可读的字符集。最常见的二进制文件扩展名包括 .jpg, .png, .exe, .class, .jar, .mp3 等。

总的来说,文本文件和二进制文件的主要区别在于它们的内容和如何解读这些内容

  • 文本文件通常只包含人类可读的文本
  • 二进制文件包含编码的数据,这些数据需要特定的软件才能正确解读

在 Python 中,你会根据文件的内容和你打算如何使用这些内容来决定以文本模式还是二进制模式打开文件。

文本模式

当你在处理人类可读的字符数据时,你会使用文本模式。这包括读写如.txt,.json,.xml,.csv,.py等格式的文件。这些文件通常包含像字母,数字和符号等可打印字符,以及一些非打印字符,如制表符,换行符和回车符。

例如,如果你正在编写一个程序来读取和修改一个 txt 文件(这是一个文本文件),那么你会以文本模式打开这个文件。

二进制模式

当你在处理非文本文件,如图像,音频,视频或可执行文件等时,你需要以二进制模式打开文件。同样,当你需要读取或写入二进制数据,如字节串或字节对象时,你也应该使用二进制模式

例如,如果你正在编写一个程序来处理图像(这是一个二进制文件),那么你会以二进制模式打开这个文件。

这些模式都非常重要,因为它们决定了 Python 如何读取和写入文件数据。

  • 在文本模式下,Python 会处理文件的编码和解码,它会自动处理换行符的转换(在 Unix 和 Windows 之间)
  • 在二进制模式下,不会进行这些额外的处理,数据被原封不动地读取或写入

“文件句柄”是什么意思?

“文件句柄”是一个抽象概念,是一个代表或引用打开的文件的值

当你打开一个文件时,操作系统会返回一个文件句柄,你可以将其视为打开文件的 “句柄”或者”标识“,这个句柄可以用来进行后续的文件操作,比如读取、写入或者关闭文件。

在 Python 中,当你使用 open 函数打开一个文件时,open 函数会返回一个文件对象,这个文件对象就是所谓的 “文件句柄”。你可以使用这个文件对象来读取、写入或者关闭文件。

  1. f = open('myfile.txt', 'r') # 'f' 就是一个文件句柄
  2. content = f.read() # 使用文件句柄读取文件
  3. f.close() # 使用文件句柄关闭文件

在这个例子中,f 就是一个文件句柄,它是 open 函数返回的文件对象。我们可以使用 f 来进行后续的文件操作。

比如,当教程中提到 <文件名>.close() 其中的 <文件名> 就是文件句柄,其实是在说使用你之前得到的文件句柄(文件对象)来关闭文件。

文件的 open、close

在 Python 中,当你使用 **open** 函数打开文件以后,最好是显式地调用 **close** 方法关闭文件。这是因为:

  1. 如果你忘记关闭文件,Python 的垃圾回收器最终会销毁对象并关闭打开的文件,但是你不能确定这会在什么时候发生。这意味着文件可能会在你不希望的时候保持打开状态。
  2. 留下打开的文件可能会导致资源泄露。操作系统通常会限制在同一时间可以打开的文件数量,如果你打开的文件过多并且忘记关闭,可能会达到这个限制。
  3. 文件在关闭之前可能不会立即写入磁盘。许多系统为了效率,在写入文件时,会先将数据保存在缓存中,然后在一个合适的时间写入磁盘。如果你没有正确关闭文件,可能会导致数据丢失。

在 Python 程序结束后,Python 解释器会尝试关闭所有未关闭的文件,但是依赖这个行为是不好的编程实践,因为你不能确定文件何时会被关闭

为了确保文件总是被正确关闭,你可以使用 with 语句来打开文件,这样文件会在 with 代码块结束时自动关闭,无论是否发生异常:

  1. with open('myfile.txt') as f:
  2. content = f.read()
  3. # 在这里,文件已经被关闭,你可以放心地继续你的代码。

这是一种更安全的打开和关闭文件的方式,推荐在处理文件时使用这种方式。

“CSV 格式数据”是什么?

CSV(Comma-Separated Values)通常被称为逗号分隔值,这是一种简单的文件格式,用于存储表格数据,比如一个电子表格或数据库。CSV 是一种广泛支持的格式,可以由任何电子表格程序阅读,如 Microsoft Excel、OpenOffice Calc 和 Google Spreadsheets。

在 CSV 中,数据表格以纯文本形式存储,其中每一行都是一个数据记录。每条记录由一个或多个字段组成,字段之间由逗号分隔。第一行通常是标题行,定义了各字段的名字。

例如,一个包含名字和电子邮件地址的简单CSV文件可能看起来像这样:

  1. Name,Email
  2. Alice,alice@example.com
  3. Bob,bob@example.com

这里,“Name”和“Email”是字段名,”Alice”和”Bob”以及对应的电子邮件地址是数据记录。

需要注意的是,虽然“CSV”代表“逗号分隔值”,但许多CSV文件使用其他字符,如制表符或空格,来分隔值。这种情况下,这样的文件仍然被认为是CSV文件。