参考官网: https://docs.python.org/zh-cn/3.10/library/csv.html
csv 是Python中内置的标准库,不需要下载,可以直接使用。
保存数据到csv文件
基本使用
将数据保存到文件中。
# 导入csv
import csv
def write_csv():
# 打开文件
with open('data.csv',encoding='utf8',mode='w') as f:
# 使用 csv的方式来写入,
wr = csv.writer(f)
# 开始写入数据
wr.writerow(["手机号","身份证id"])
if __name__ == '__main__':
write_csv()
执行可以看到对应的效果,生成了一个 data.csv 的文件
- writerow() 是csv中提供的方法 可以写入一行数据。 必须传入 一个列表类型的数据。
如果要写入多行数据。 那就使用 for 循环
import csv
def write_csv():
with open('data.csv',encoding='utf8',mode='w') as f:
# 使用 csv的方式来写入, 固定用法
wr = csv.writer(f)
# 开始写入数据 往文件中写入数据, 数据必须是 列表格式。写入一行
wr.writerow(["手机号","身份证id"])
for i in range(10):
wr.writerow(["13212231122","111122222334455555"])
if __name__ == '__main__':
write_csv()
使用for循环 写入10行数据。
但是写入的数据有问题,会多一个空行。
因为csv 模块在写入文件的时候,会自动添加换行符。在open的时候,指定新行为空的字符串。
import csv
def write_csv():
# 默认的csv文件中会空白换行,使用 newline="" 关闭空白换行
with open('data.csv',encoding='utf8',mode='w',newline="") as f:
# 使用 csv的方式来写入, 固定用法
wr = csv.writer(f)
# 开始写入数据 往文件中写入数据, 数据必须是 列表格式。写入一行
wr.writerow(["手机号","身份证id"])
for i in range(10):
wr.writerow(["13212231122","111122222334455555"])
if __name__ == '__main__':
write_csv()
再次运行,可以看到对应的效果。
读取csv文件的内容
读取data.csv 文件的内容
import csv
def read_csv():
# 读取权限
with open(file="data.csv",encoding='utf8',mode='r') as f:
# reader 读取文件内容 固定用法
all_rows = csv.reader(f)
# csv 中有很多行数据,需要一行一行去读
for line in all_rows:
print(line)
if __name__ == '__main__':
# write_csv()
read_csv()
解析文件练习
gb2260.csv
上面附件文件中 存放了所有中国地区 身份证号的前6位。请使用python程序将里面的内容打印出来
将上面的文件下载下来,放到 testdata 下, (可以拖拽进去)
在 common/file_hanlder.py 中定义 一个函数 get_china_code()
通过代码的方式读取 gb2260.csv 文件中的所有地区编码。并随机选择一个。
1. 使用文件绝对路径
2.读取文件
将复制的绝对文件路径 粘贴进来,字符串前 使用 r
import csv
def get_china_code():
# as f 别名 f相当于是 前面open打开的文件 绝对路径字符串 前添加r
with open(file=r"C:\Users\zengy\PycharmProjects\pythonProject13\testdata\gb2260.csv",
encoding='utf8',mode='r') as f:
# 读取完成之后会将所有的内容放在一个列表对象中
rows = csv.reader(f)
# 循环列表
for row in rows:
print(row)
if __name__ == '__main__':
# write_csv()
# read_csv()
get_china_code()
3. 将列表转换为字符串
因为从csv文件中读出来的数据 默认是列表格式。因为前6位希望是字符串 格式。
join 方法列表转换 字符串
code = ['659000']
print(code,type(code)) # # 659000 <class 'str'>
# 转换 字符串
a = "".join(code)
print(a,type(a)) # 659000 <class 'str'>
可以将列表转换 为字符串。
对应的代码
def get_china_code():
# as f 别名 f相当于是 前面open打开的文件 绝对路径字符串 前添加r
with open(file=r"C:\Users\zengy\PycharmProjects\pythonProject13\testdata\gb2260.csv",
encoding='utf8',mode='r') as f:
# 读取完成之后会将所有的内容放在一个列表对象中
rows = csv.reader(f)
# 循环列表
for row in rows:
# print(row,type(row))
code = "".join(row)
print(code,type(code))
# TODO 随机从这么多的地区码中选择一个 返回。
random_code = "659000"
return random_code
if __name__ == '__main__':
# write_csv()
# read_csv()
get_china_code()
使用random.choice 获取随机
import csv
import random
def get_china_code():
# as f 别名 f相当于是 前面open打开的文件 绝对路径字符串 前添加r
with open(file=r"C:\Users\zengy\PycharmProjects\pythonProject13\testdata\gb2260.csv",
encoding='utf8',mode='r') as f:
# 读取完成之后会将所有的内容放在一个列表对象中
rows = csv.reader(f)
# 定义空列表
allcodes = []
# 循环列表
for row in rows:
# print(row,type(row))
code = "".join(row)
# 每次取到一个数据,讲这个数据放在列表中
allcodes.append(code)
# print(code,type(code))
# for循环执行完,查看列表的内容
print(allcodes)
# 随机从这么多的地区码中选择一个 返回。
random_code = random.choice(allcodes)
return random_code
if __name__ == '__main__':
# write_csv()
# read_csv()
code = get_china_code()
print(f"获取随机code值:{code}")
代码整理
根据单一性原则,将获取code的代码放在 utils.py 工具模块中。
整理之后的代码,
"""
这个文件中存放自己定义的一些常用的工具函数。
生成测试数据
"""
import random
import csv
def get_china_code():
# as f 别名 f相当于是 前面open打开的文件 绝对路径字符串 前添加r
with open(file=r"C:\Users\zengy\PycharmProjects\pythonProject13\testdata\gb2260.csv",
encoding='utf8',mode='r') as f:
# 读取完成之后会将所有的内容放在一个列表对象中
rows = csv.reader(f)
# 定义空列表
allcodes = []
# 循环列表
for row in rows:
# print(row,type(row))
code = "".join(row)
# 每次取到一个数据,讲这个数据放在列表中
allcodes.append(code)
# print(code,type(code))
# for循环执行完,查看列表的内容
# print(allcodes)
# 随机从这么多的地区码中选择一个 返回。
random_code = random.choice(allcodes)
return random_code
def get_phone():
"""
自动随机生成一个手机号码
:return:
"""
pre_phones = ["130", "131", "132", "133", "134", "135", "136", "137", "138", "139",
"170", "172", "179",
"150", "151", "155", "156",
"188",
"199"]
# 随机取号段
pre_3 = random.choice(pre_phones)
# print(f"随机选择号段 {pre_3}")
# 生成后8位
last_8 = ""
for i in range(8):
# 随机生成一个数字n
n = random.randint(0, 9)
# 拼接字符串 将n转换为字符串
last_8 = last_8 + str(n) # 每次随机取到一个数字,转换字符串之后 放到last_8 后面
# print(f"生成后8位 {last_8}")
# 将前3位后8位 组合一起
phone = pre_3 + last_8
return phone
def get_id():
"""
随机生成身份证号
:return:
"""
# 函数定义在函数的内部 闭包
def pre_6():
n = get_china_code()
# n = ""
# for i in range(6):
# # 循环6次 每次生成1个随机数字,转换位字符串进行拼接
# n = n + str(random.randint(0, 9))
# 循环执行完成
return n
def ymd_8(startyear=1922, endyear=2021):
# 生成出生的年 随机生成
year = random.randint(startyear, endyear)
# print(f"生成年份 {year}")
# 生成月份 1-12
month = random.randint(1, 12)
# 如果月份在1-9 之间,前面需要补0
if month < 10:
month = "0" + str(month) # 转换位字符串之后前面 补0
# print(f"生成的月份 {month}")
# 1,3,5,7,8,10,12 天数 31天
if int(month) in [1, 3, 5, 7, 8, 10, 12]:
day = random.randint(1, 31) #
# 4,6,9,11 月 30天
elif int(month) in [4, 6, 9, 11]:
day = random.randint(1, 30)
# 闰年 2月份 29天
elif (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
day = random.randint(1, 29)
# 以上都不符合,那就是平年
else:
day = random.randint(1, 28)
# 如果day 在1-9 之间 前面补0
if day < 10:
day = "0" + str(day)
# print(f"生成的日期 {day}")
# 转换为字符串 进行拼接
ydm = str(year) + str(month) + str(day) # 等价于 f"{year}{month}{day}"
return ydm
def last_4():
nums = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'X']
# 前三位 数字
n3 = ""
for i in range(3):
n3 = n3 + str(random.randint(0, 9))
# 第四位 随机从 nums 选择一个
n4 = random.choice(nums)
# 将n3 和 n4 拼接之后返回
return n3 + n4
# 生成身份证id
id = pre_6() + ymd_8() + last_4()
return id
if __name__ == '__main__':
# 测试生成手机号
# print(get_phone())
# 测试生成身份证id
print(get_id())
file_handler中只保存 读取和写入相关的操作。
"""
处理文件
"""
# 导入csv
import csv
from common.utils import get_id,get_phone
def write_csv():
with open('data.csv',encoding='utf8',mode='w',newline="") as f:
# 使用 csv的方式来写入, 固定用法
wr = csv.writer(f)
# 开始写入数据 往文件中写入数据, 数据必须是 列表格式。写入一行
wr.writerow(["手机号","身份证id"])
for i in range(10):
wr.writerow([get_phone(),get_id()])
def read_csv():
# as f 别名 f相当于是 前面open打开的文件
with open(file="data.csv",encoding='utf8',mode='r') as f:
# reader 读取文件内容 固定用法
all_rows = csv.reader(f)
# csv 中有很多行数据,需要一行一行去读
for line in all_rows:
print(line)
if __name__ == '__main__':
write_csv()
# write_csv()
# read_csv()
# code = get_china_code()
# print(f"获取随机code值:{code}")