找回密码
 会员注册
查看: 22|回复: 0

使用python读写txt和json(jsonl)大文件

[复制链接]

4

主题

0

回帖

13

积分

新手上路

积分
13
发表于 2024-9-10 20:43:40 | 显示全部楼层 |阅读模式
在深度学习方向,尤其是NLP领域,最重要的就是和海量的文字打交道,不管是读取原始数据还是处理数据亦或是最终写数据,合理的读写文件是极为重要的,这篇博客用以记录一下工作中学习到的对大文件读写的过程。目录读写txt文本文件读写JSON文件读写JSONL文件遇到的问题读写txt文本文件最简单也是最常见的就是读写txt文本文件读写txt文件直接调用python内部库的open和write函数就基本可以了,比如中student.txt文件中:张奇18计算机学院看书,打篮球,看电影刘欣19计算机学院唱歌,健身杜航18计算机学院动漫,看书盛蓉20外国语学院唱歌,看书,美食余杰20土木学院唱歌,运动,游戏王某19土木学院羽毛球,游戏李某20外国语学院动漫,唱歌其中分别为姓名,年龄,学院,兴趣爱好,每类用一个制表符(\t)隔开,兴趣爱好中间用英文逗号分隔开来,然后用open打开txt文件并将内容读取打印file_txt="student.txt"withopen(file_txt)asfile:forlineinfile:name,age,department,hobby=line.strip().split("\t")print(name,age,department,hobby)同样,也可以用write函数写到一个新的文件中去,过程中我们可以用几个list先将数据存起来,也可以一边读一边写,但是一行行读一行行写小数据还好,当文件过大时大量的文件io会话费大量的时间,但是使用list全部存储然后写的话又会比较耗内存,各有优劣,看情况使用使用list:file_txt="student.txt"file_new_txt="newstudent.txt"stu=[]withopen(file_txt)asfile:forlineinfile:name,age,department,hobby=line.strip().split("\t")stu.append(name+"-"+age+"-"+department+"-"+hobby)withopen(file_new_txt,"a+")asfile:forstudentinstu:file.write(student+"\n")边读边写:file_txt="student.txt"file_new_txt="newstudent.txt"withopen(file_txt)asfile:forlineinfile:name,age,department,hobby=line.strip().split("\t")withopen(file_new_txt,"a+")asfile_new:file_new.write(name+"-"+age+"-"+department+"-"+hobby+"\n") txt文件是最常用的,但是也有其局限性,就是很难对文件中分隔开的内容进行标注,比如,对每一行数据都标明姓名:张奇,年龄:18这样,这时就需要用到json文件格式了读写JSON文件python中对json文件的读写需要导入json包,然后调用包内函数就可以完成读写了importjsonfile_txt_path="student.txt"file_json_path="student.json"withopen(file_txt_path)asfile:forlineinfile:name,age,department,hobby=line.strip().split("\t")hobby=hobby.split(",")data={"姓名":name,"年龄":age,"学院":department,"爱好":hobby}withopen(file_json_path,"a+")asfile_json:file_json.write(json.dumps(data,ensure_ascii=False))file_json.write(","+"\n")这样就会获得这样一个json文件   但是这样的json文件格式是有问题的,我们需要在前面和后面加个[],并且把最后面那个","去掉前后加[]倒是比较简单,如何去掉最后一个","倒是比较头疼,我暂时的思路是统计txt文件行数,在最后一行的时候就不写入","了我们调用wc来统计文件行数:importjsonfile_txt_path="student.txt"file_json_path="student.json"def_wc_count(file_name):"""通过wc命令统计文件行数"""importsubprocessout=subprocess.getoutput("wc-l%s"%file_name)returnint(out.split()[0])count=_wc_count(file_txt_path)i=0withopen(file_json_path,"a+")asfile:file.write("["+"\n")withopen(file_txt_path)asfile:forlineinfile:name,age,department,hobby=line.strip().split("\t")hobby=hobby.split(",")data={"姓名":name,"年龄":age,"学院":department,"爱好":hobby}withopen(file_json_path,"a+")asfile_json:file_json.write(json.dumps(data,ensure_ascii=False))if(i
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-29 13:31 , Processed in 1.120777 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表