尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Day 09 · 存成文件:CSV / Excel / JSON

Day 09 · 存成文件:CSV / Excel / JSON 「AI Python 系列」第 03 栏 · Python 爬虫实战全栏 15 篇 · 零成本跟完 作者梅雅达编程笔记首发CSDN摘要数据抓下来了存哪里怎么存本篇对比三种最常用格式的优缺点CSV轻量通用但没格式、Excel好看且支持多Sheet、JSON结构化最适合程序处理。手把手教你用pandas存CSV和Excel、用json模块存结构化数据重点解决中文乱码这个老大难问题。最后讲增量写入vs全量覆盖的选择策略让你的爬虫数据不丢失。前面几篇讲了怎么抓数据但数据抓回来如果没存好等于白抓。今天把三种最主流的存储方式讲清楚CSV、Excel、JSON。搞明白什么时候用哪个以及中文乱码怎么彻底解决。一、三种格式对比格式优点缺点适合场景CSV轻量、通用、所有工具都能打开没有格式颜色、列宽、不支持多Sheet数据交换、后续程序处理Excel好看、支持格式和多Sheet文件较大、需要额外库给非技术人员看、做报表JSON结构化、嵌套数据友好不适合表格数据、人眼看费劲程序间数据交换、API 存储简单说给自己后续处理 →CSV给老板/客户看 →Excel存原始数据给程序用 →JSON二、CSV三行代码搞定用pandas存importpandasaspd data[{标题:肖申克的救赎,评分:9.7,年份:1994},{标题:霸王别姬,评分:9.6,年份:1993},{标题:阿甘正传,评分:9.5,年份:1994},]dfpd.DataFrame(data)df.to_csv(movies.csv,indexFalse,encodingutf-8-sig)三行代码数据就存好了。关键点indexFalse不把行号写进去encodingutf-8-sig这个是解决中文乱码的关键。utf-8-sig会在文件开头加一个BOM标记Excel打开时能正确识别中文。如果用utf-8Exce打开可能乱码。用csv模块存如果不想引入pandas也可以用标准库csvimportcsv data[{标题:肖申克的救赎,评分:9.7,年份:1994},{标题:霸王别姬,评分:9.6,年份:1993},]# 写入withopen(movies.csv,w,newline,encodingutf-8-sig)asf:writercsv.DictWriter(f,fieldnames[标题,评分,年份])writer.writeheader()# 写表头writer.writerows(data)# 写数据效果一样区别是csv模块是 Python 内置的不需要额外安装。三、Excel带格式更好看CSV存出来是纯文本Excel 可以加格式列宽、颜色、数字格式……需要用openpyxl库pipinstallopenpyxl基础写入importopenpyxl wbopenpyxl.Workbook()wswb.active ws.title电影数据# 写表头headers[标题,评分,年份,链接]forcol,headerinenumerate(headers,1):ws.cell(row1,columncol,valueheader)# 写数据data[[肖申克的救赎,9.7,1994,https://movie.douban.com/subject/1292052/],[霸王别姬,9.6,1993,https://movie.douban.com/subject/1291546/],[阿甘正传,9.5,1994,https://movie.douban.com/subject/1292720/],]forrow_idx,row_datainenumerate(data,2):forcol_idx,valueinenumerate(row_data,1):ws.cell(rowrow_idx,columncol_idx,valuevalue)wb.save(movies.xlsx)加格式fromopenpyxl.stylesimportFont,Alignment,PatternFill,Border,Side# 表头样式header_fontFont(boldTrue,colorFFFFFF,size12)header_fillPatternFill(start_color4472C4,end_color4472C4,fill_typesolid)header_alignmentAlignment(horizontalcenter,verticalcenter)forcolinrange(1,5):cellws.cell(row1,columncol)cell.fontheader_font cell.fillheader_fill cell.alignmentheader_alignment# 设置列宽ws.column_dimensions[A].width25# 标题列ws.column_dimensions[B].width10# 评分列ws.column_dimensions[C].width10# 年份列ws.column_dimensions[D].width50# 链接列# 数据行样式forrowinrange(2,ws.max_row1):ws.cell(rowrow,column2).number_format0.0# 评分保留一位小数ws.cell(rowrow,column4).fontFont(color0563C1,underlinesingle)# 链接样式wb.save(movies_styled.xlsx)用pandas存Excel更简单如果不需要复杂格式pandas也能直接存Excelimportpandasaspd dfpd.DataFrame(data)df.to_excel(movies.xlsx,indexFalse,sheet_name电影数据)一行搞定但没有自定义格式。四、JSON结构化数据首选爬虫抓到的数据如果是嵌套结构比如包含评论列表、标签数组JSON是最合适的格式。基础写入importjson data[{title:肖申克的救赎,rating:9.7,year:1994,directors:[弗兰克·德拉邦特],actors:[蒂姆·罗宾斯,摩根·弗里曼],tags:[剧情,犯罪],url:https://movie.douban.com/subject/1292052/},{title:霸王别姬,rating:9.6,year:1993,directors:[陈凯歌],actors:[张国荣,张丰毅,巩俐],tags:[剧情,爱情,同性],url:https://movie.douban.com/subject/1291546/}]withopen(movies.json,w,encodingutf-8)asf:json.dump(data,f,ensure_asciiFalse,indent2)关键点ensure_asciiFalse必须有否则中文会变成\uXXXX的编码indent2缩进 2 个空格方便阅读。如果追求文件体积小去掉这个参数encodingutf-8JSON 文件统一用 UTF-8读取JSONwithopen(movies.json,r,encodingutf-8)asf:datajson.load(f)formovieindata:print(f{movie[title]}-{movie[rating]}分)五、中文乱码问题彻底解决中文乱码是爬虫数据存储时最常遇到的问题。根源就一个编码不一致。乱码场景和解决方案场景原因解决方案Excel打开CSV乱码Excel默认按GBK打开文件是UTF-8用utf-8-sig编码读取文件乱码文件编码和读取编码不一致先确认文件编码用对应编码读取JSON里中文变\uXXXX没设置ensure_asciiFalse加上ensure_asciiFalse控制台打印乱码终端编码问题print前设置环境变量或用 IDE万能读取函数defread_file_auto_encoding(filepath):自动检测编码读取文件encodings[utf-8-sig,utf-8,gbk,gb2312,gb18030]forencodinginencodings:try:withopen(filepath,r,encodingencoding)asf:contentf.read()returncontentexceptUnicodeDecodeError:continueraiseValueError(f无法用常见编码读取文件{filepath})一个原则写入时统一用utf-8或utf-8-sigCSV给Excel用就utf-8-sig给程序用就utf-8JSON永远用utf-8ensure_asciiFalse六、增量写入 vs 全量覆盖全量覆盖每次运行都把所有数据重新写一遍。# 简单但如果中途程序崩溃之前抓的数据全没了df.to_csv(data.csv,indexFalse,encodingutf-8-sig)适合数据量不大、每次都全量重跑的场景。增量写入每次只追加新数据。importosimportcsvimportpandasaspd filepathdata.csvnew_data[{标题:新电影1,评分:8.5},{标题:新电影2,评分:7.9},]# 文件不存在创建新文件ifnotos.path.exists(filepath):dfpd.DataFrame(new_data)df.to_csv(filepath,indexFalse,encodingutf-8-sig)else:# 文件存在追加写入df_newpd.DataFrame(new_data)df_new.to_csv(filepath,modea,headerFalse,indexFalse,encodingutf-8-sig)用csv模块的追加方式importcsvimportos filepathdata.csvfieldnames[标题,评分]new_data[{标题:新电影,评分:8.5}]file_existsos.path.exists(filepath)withopen(filepath,a,newline,encodingutf-8-sig)asf:writercsv.DictWriter(f,fieldnamesfieldnames)ifnotfile_exists:writer.writeheader()# 第一次写加表头writer.writerows(new_data)怎么选场景推荐方式数据量小 1000 条全量覆盖简单数据量大、爬取时间长增量写入防丢失每次要重新抓取全量全量覆盖只抓新数据增量写入完整代码评论区留言领取 本篇成本透明栏项目数值API 调用次数0消耗 Token0成本¥0练手改造题改造 1基础把 Day 03 抓到的豆瓣电影数据分别存成CSV、Excel、JSON三种格式用Excel打开CSV确认没有乱码。改造 2进阶给Excel加上条件格式评分 ≥ 9.5 的行标绿色背景评分 9.0 的标红色。提示用openpyxl的PatternFill。下期预告Day 10 · 存进数据库SQLite 从零上手数据量大到Excel打不开了怎么办上数据库。SQLite是 Python 内置的数据库不用安装任何东西。Day 10 教你建表、增删改查以及把爬虫数据自动入库。 资源与工具pandas IO 文档https://pandas.pydata.org/docs/user_guide/io.htmlopenpyxl 文档https://openpyxl.readthedocs.io/Python csv 模块https://docs.python.org/3/library/csv.html本专栏配套代码CSDN 下载区每篇更新梅雅达编程笔记专注 Python AI 实战教程提供数据采集与自动化定制服务往期回顾Day 01 · 爬虫能干啥不能干啥Day 02 · 环境搭建与第一个爬虫Day 03 · 列表页抓取批量拿数据Day 04 · 详情页 翻页从一条到一百条Day 05 · Ajax 请求拦截抓看不到的数据Day 06 · 浏览器自动化DrissionPage 实战Day 07 · Cookie 与 Session处理登录状态Day 08 · 反爬对策Headers 限速 代理专栏推荐「AI Python 系列」第 03 栏 · Python 爬虫实战连载中「AI Python 系列」第 02 栏 · AI数据可视化连载中「AI Python 系列」第 01 栏 · AI自动化办公连载中资源领取关注作者获取本栏完整代码和数据集原创声明本文为梅雅达编程笔记原创作品未经允许不得转载。
返回列表