参考官网: https://docs.python.org/zh-cn/3.10/library/csv.html
csv 是Python中内置的标准库,不需要下载,可以直接使用。
保存数据到csv文件
基本使用
将数据保存到文件中。
# 导入csvimport csvdef 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 csvdef 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 csvdef 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 csvdef 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 csvdef get_china_code():# as f 别名 f相当于是 前面open打开的文件 绝对路径字符串 前添加rwith 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打开的文件 绝对路径字符串 前添加rwith 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_codeif __name__ == '__main__':# write_csv()# read_csv()get_china_code()
使用random.choice 获取随机
import csvimport randomdef get_china_code():# as f 别名 f相当于是 前面open打开的文件 绝对路径字符串 前添加rwith 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_codeif __name__ == '__main__':# write_csv()# read_csv()code = get_china_code()print(f"获取随机code值:{code}")
代码整理
根据单一性原则,将获取code的代码放在 utils.py 工具模块中。
整理之后的代码,
"""这个文件中存放自己定义的一些常用的工具函数。生成测试数据"""import randomimport csvdef get_china_code():# as f 别名 f相当于是 前面open打开的文件 绝对路径字符串 前添加rwith 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_codedef 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):# 随机生成一个数字nn = random.randint(0, 9)# 拼接字符串 将n转换为字符串last_8 = last_8 + str(n) # 每次随机取到一个数字,转换字符串之后 放到last_8 后面# print(f"生成后8位 {last_8}")# 将前3位后8位 组合一起phone = pre_3 + last_8return phonedef 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 ndef ymd_8(startyear=1922, endyear=2021):# 生成出生的年 随机生成year = random.randint(startyear, endyear)# print(f"生成年份 {year}")# 生成月份 1-12month = random.randint(1, 12)# 如果月份在1-9 之间,前面需要补0if 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 之间 前面补0if day < 10:day = "0" + str(day)# print(f"生成的日期 {day}")# 转换为字符串 进行拼接ydm = str(year) + str(month) + str(day) # 等价于 f"{year}{month}{day}"return ydmdef 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# 生成身份证idid = pre_6() + ymd_8() + last_4()return idif __name__ == '__main__':# 测试生成手机号# print(get_phone())# 测试生成身份证idprint(get_id())
file_handler中只保存 读取和写入相关的操作。
"""处理文件"""# 导入csvimport csvfrom common.utils import get_id,get_phonedef 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}")

