参考官网: https://docs.python.org/zh-cn/3.10/library/csv.html
csv 是Python中内置的标准库,不需要下载,可以直接使用。

保存数据到csv文件

基本使用

将数据保存到文件中。

  1. # 导入csv
  2. import csv
  3. def write_csv():
  4. # 打开文件
  5. with open('data.csv',encoding='utf8',mode='w') as f:
  6. # 使用 csv的方式来写入,
  7. wr = csv.writer(f)
  8. # 开始写入数据
  9. wr.writerow(["手机号","身份证id"])
  10. if __name__ == '__main__':
  11. write_csv()

执行可以看到对应的效果,生成了一个 data.csv 的文件
image.png

  • writerow() 是csv中提供的方法 可以写入一行数据。 必须传入 一个列表类型的数据。

如果要写入多行数据。 那就使用 for 循环

  1. import csv
  2. def write_csv():
  3. with open('data.csv',encoding='utf8',mode='w') as f:
  4. # 使用 csv的方式来写入, 固定用法
  5. wr = csv.writer(f)
  6. # 开始写入数据 往文件中写入数据, 数据必须是 列表格式。写入一行
  7. wr.writerow(["手机号","身份证id"])
  8. for i in range(10):
  9. wr.writerow(["13212231122","111122222334455555"])
  10. if __name__ == '__main__':
  11. write_csv()

使用for循环 写入10行数据。
但是写入的数据有问题,会多一个空行。
image.png
因为csv 模块在写入文件的时候,会自动添加换行符。在open的时候,指定新行为空的字符串。
image.png

  1. import csv
  2. def write_csv():
  3. # 默认的csv文件中会空白换行,使用 newline="" 关闭空白换行
  4. with open('data.csv',encoding='utf8',mode='w',newline="") as f:
  5. # 使用 csv的方式来写入, 固定用法
  6. wr = csv.writer(f)
  7. # 开始写入数据 往文件中写入数据, 数据必须是 列表格式。写入一行
  8. wr.writerow(["手机号","身份证id"])
  9. for i in range(10):
  10. wr.writerow(["13212231122","111122222334455555"])
  11. if __name__ == '__main__':
  12. write_csv()

再次运行,可以看到对应的效果。
image.png

读取csv文件的内容

读取data.csv 文件的内容

  1. import csv
  2. def read_csv():
  3. # 读取权限
  4. with open(file="data.csv",encoding='utf8',mode='r') as f:
  5. # reader 读取文件内容 固定用法
  6. all_rows = csv.reader(f)
  7. # csv 中有很多行数据,需要一行一行去读
  8. for line in all_rows:
  9. print(line)
  10. if __name__ == '__main__':
  11. # write_csv()
  12. read_csv()

image.png


解析文件练习

gb2260.csv
上面附件文件中 存放了所有中国地区 身份证号的前6位。请使用python程序将里面的内容打印出来
将上面的文件下载下来,放到 testdata 下, (可以拖拽进去)
image.png
在 common/file_hanlder.py 中定义 一个函数 get_china_code()
通过代码的方式读取 gb2260.csv 文件中的所有地区编码。并随机选择一个。

1. 使用文件绝对路径

文件上—【右键】—【Copy Path】
image.png
选择绝对路径。
image.png

2.读取文件

将复制的绝对文件路径 粘贴进来,字符串前 使用 r

  1. import csv
  2. def get_china_code():
  3. # as f 别名 f相当于是 前面open打开的文件 绝对路径字符串 前添加r
  4. with open(file=r"C:\Users\zengy\PycharmProjects\pythonProject13\testdata\gb2260.csv",
  5. encoding='utf8',mode='r') as f:
  6. # 读取完成之后会将所有的内容放在一个列表对象中
  7. rows = csv.reader(f)
  8. # 循环列表
  9. for row in rows:
  10. print(row)
  11. if __name__ == '__main__':
  12. # write_csv()
  13. # read_csv()
  14. get_china_code()

image.png

3. 将列表转换为字符串

因为从csv文件中读出来的数据 默认是列表格式。因为前6位希望是字符串 格式。

join 方法列表转换 字符串

  1. code = ['659000']
  2. print(code,type(code)) # # 659000 <class 'str'>
  3. # 转换 字符串
  4. a = "".join(code)
  5. print(a,type(a)) # 659000 <class 'str'>

可以将列表转换 为字符串。
对应的代码

  1. def get_china_code():
  2. # as f 别名 f相当于是 前面open打开的文件 绝对路径字符串 前添加r
  3. with open(file=r"C:\Users\zengy\PycharmProjects\pythonProject13\testdata\gb2260.csv",
  4. encoding='utf8',mode='r') as f:
  5. # 读取完成之后会将所有的内容放在一个列表对象中
  6. rows = csv.reader(f)
  7. # 循环列表
  8. for row in rows:
  9. # print(row,type(row))
  10. code = "".join(row)
  11. print(code,type(code))
  12. # TODO 随机从这么多的地区码中选择一个 返回。
  13. random_code = "659000"
  14. return random_code
  15. if __name__ == '__main__':
  16. # write_csv()
  17. # read_csv()
  18. get_china_code()

使用random.choice 获取随机

  1. import csv
  2. import random
  3. def get_china_code():
  4. # as f 别名 f相当于是 前面open打开的文件 绝对路径字符串 前添加r
  5. with open(file=r"C:\Users\zengy\PycharmProjects\pythonProject13\testdata\gb2260.csv",
  6. encoding='utf8',mode='r') as f:
  7. # 读取完成之后会将所有的内容放在一个列表对象中
  8. rows = csv.reader(f)
  9. # 定义空列表
  10. allcodes = []
  11. # 循环列表
  12. for row in rows:
  13. # print(row,type(row))
  14. code = "".join(row)
  15. # 每次取到一个数据,讲这个数据放在列表中
  16. allcodes.append(code)
  17. # print(code,type(code))
  18. # for循环执行完,查看列表的内容
  19. print(allcodes)
  20. # 随机从这么多的地区码中选择一个 返回。
  21. random_code = random.choice(allcodes)
  22. return random_code
  23. if __name__ == '__main__':
  24. # write_csv()
  25. # read_csv()
  26. code = get_china_code()
  27. print(f"获取随机code值:{code}")

代码整理

根据单一性原则,将获取code的代码放在 utils.py 工具模块中。
整理之后的代码,

  1. """
  2. 这个文件中存放自己定义的一些常用的工具函数。
  3. 生成测试数据
  4. """
  5. import random
  6. import csv
  7. def get_china_code():
  8. # as f 别名 f相当于是 前面open打开的文件 绝对路径字符串 前添加r
  9. with open(file=r"C:\Users\zengy\PycharmProjects\pythonProject13\testdata\gb2260.csv",
  10. encoding='utf8',mode='r') as f:
  11. # 读取完成之后会将所有的内容放在一个列表对象中
  12. rows = csv.reader(f)
  13. # 定义空列表
  14. allcodes = []
  15. # 循环列表
  16. for row in rows:
  17. # print(row,type(row))
  18. code = "".join(row)
  19. # 每次取到一个数据,讲这个数据放在列表中
  20. allcodes.append(code)
  21. # print(code,type(code))
  22. # for循环执行完,查看列表的内容
  23. # print(allcodes)
  24. # 随机从这么多的地区码中选择一个 返回。
  25. random_code = random.choice(allcodes)
  26. return random_code
  27. def get_phone():
  28. """
  29. 自动随机生成一个手机号码
  30. :return:
  31. """
  32. pre_phones = ["130", "131", "132", "133", "134", "135", "136", "137", "138", "139",
  33. "170", "172", "179",
  34. "150", "151", "155", "156",
  35. "188",
  36. "199"]
  37. # 随机取号段
  38. pre_3 = random.choice(pre_phones)
  39. # print(f"随机选择号段 {pre_3}")
  40. # 生成后8位
  41. last_8 = ""
  42. for i in range(8):
  43. # 随机生成一个数字n
  44. n = random.randint(0, 9)
  45. # 拼接字符串 将n转换为字符串
  46. last_8 = last_8 + str(n) # 每次随机取到一个数字,转换字符串之后 放到last_8 后面
  47. # print(f"生成后8位 {last_8}")
  48. # 将前3位后8位 组合一起
  49. phone = pre_3 + last_8
  50. return phone
  51. def get_id():
  52. """
  53. 随机生成身份证号
  54. :return:
  55. """
  56. # 函数定义在函数的内部 闭包
  57. def pre_6():
  58. n = get_china_code()
  59. # n = ""
  60. # for i in range(6):
  61. # # 循环6次 每次生成1个随机数字,转换位字符串进行拼接
  62. # n = n + str(random.randint(0, 9))
  63. # 循环执行完成
  64. return n
  65. def ymd_8(startyear=1922, endyear=2021):
  66. # 生成出生的年 随机生成
  67. year = random.randint(startyear, endyear)
  68. # print(f"生成年份 {year}")
  69. # 生成月份 1-12
  70. month = random.randint(1, 12)
  71. # 如果月份在1-9 之间,前面需要补0
  72. if month < 10:
  73. month = "0" + str(month) # 转换位字符串之后前面 补0
  74. # print(f"生成的月份 {month}")
  75. # 1,3,5,7,8,10,12 天数 31天
  76. if int(month) in [1, 3, 5, 7, 8, 10, 12]:
  77. day = random.randint(1, 31) #
  78. # 4,6,9,11 月 30天
  79. elif int(month) in [4, 6, 9, 11]:
  80. day = random.randint(1, 30)
  81. # 闰年 2月份 29天
  82. elif (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
  83. day = random.randint(1, 29)
  84. # 以上都不符合,那就是平年
  85. else:
  86. day = random.randint(1, 28)
  87. # 如果day 在1-9 之间 前面补0
  88. if day < 10:
  89. day = "0" + str(day)
  90. # print(f"生成的日期 {day}")
  91. # 转换为字符串 进行拼接
  92. ydm = str(year) + str(month) + str(day) # 等价于 f"{year}{month}{day}"
  93. return ydm
  94. def last_4():
  95. nums = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'X']
  96. # 前三位 数字
  97. n3 = ""
  98. for i in range(3):
  99. n3 = n3 + str(random.randint(0, 9))
  100. # 第四位 随机从 nums 选择一个
  101. n4 = random.choice(nums)
  102. # 将n3 和 n4 拼接之后返回
  103. return n3 + n4
  104. # 生成身份证id
  105. id = pre_6() + ymd_8() + last_4()
  106. return id
  107. if __name__ == '__main__':
  108. # 测试生成手机号
  109. # print(get_phone())
  110. # 测试生成身份证id
  111. print(get_id())

file_handler中只保存 读取和写入相关的操作。

  1. """
  2. 处理文件
  3. """
  4. # 导入csv
  5. import csv
  6. from common.utils import get_id,get_phone
  7. def write_csv():
  8. with open('data.csv',encoding='utf8',mode='w',newline="") as f:
  9. # 使用 csv的方式来写入, 固定用法
  10. wr = csv.writer(f)
  11. # 开始写入数据 往文件中写入数据, 数据必须是 列表格式。写入一行
  12. wr.writerow(["手机号","身份证id"])
  13. for i in range(10):
  14. wr.writerow([get_phone(),get_id()])
  15. def read_csv():
  16. # as f 别名 f相当于是 前面open打开的文件
  17. with open(file="data.csv",encoding='utf8',mode='r') as f:
  18. # reader 读取文件内容 固定用法
  19. all_rows = csv.reader(f)
  20. # csv 中有很多行数据,需要一行一行去读
  21. for line in all_rows:
  22. print(line)
  23. if __name__ == '__main__':
  24. write_csv()
  25. # write_csv()
  26. # read_csv()
  27. # code = get_china_code()
  28. # print(f"获取随机code值:{code}")

所有代码

2022-05-19-project.zip