您现在的位置是:首页 > 技术教程 正文

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

admin 阅读: 2024-03-24
后台-插件-广告管理-内容页头部广告(手机)

在深度学习方向,尤其是NLP领域,最重要的就是和海量的文字打交道,不管是读取原始数据还是处理数据亦或是最终写数据,合理的读写文件是极为重要的,这篇博客用以记录一下工作中学习到的对大文件读写的过程。

目录

读写txt文本文件

读写JSON文件

读写JSONL文件

遇到的问题

读写txt文本文件

最简单也是最常见的就是读写txt文本文件

读写txt文件直接调用python内部库的open和write函数就基本可以了,比如中student.txt文件中:

  1. 张奇 18 计算机学院 看书,打篮球,看电影
  2. 刘欣 19 计算机学院 唱歌,健身
  3. 杜航 18 计算机学院 动漫,看书
  4. 盛蓉 20 外国语学院 唱歌,看书,美食
  5. 余杰 20 土木学院 唱歌,运动,游戏
  6. 王某 19 土木学院 羽毛球,游戏
  7. 李某 20 外国语学院 动漫,唱歌

其中分别为姓名,年龄,学院,兴趣爱好,每类用一个制表符(\t)隔开,兴趣爱好中间用英文逗号分隔开来,然后用open打开txt文件并将内容读取打印

  1. file_txt = "student.txt"
  2. with open(file_txt) as file:
  3. for line in file:
  4. name,age,department,hobby = line.strip().split("\t")
  5. print(name,age,department,hobby)

同样,也可以用write函数写到一个新的文件中去,过程中我们可以用几个list先将数据存起来,也可以一边读一边写,但是一行行读一行行写小数据还好,当文件过大时大量的文件io会话费大量的时间,但是使用list全部存储然后写的话又会比较耗内存,各有优劣,看情况使用

使用list:

  1. file_txt = "student.txt"
  2. file_new_txt = "newstudent.txt"
  3. stu = []
  4. with open(file_txt) as file:
  5. for line in file:
  6. name,age,department,hobby = line.strip().split("\t")
  7. stu.append(name+"-"+age+"-"+department+"-"+hobby)
  8. with open(file_new_txt,"a+") as file:
  9. for student in stu:
  10. file.write(student+"\n")

边读边写:

  1. file_txt = "student.txt"
  2. file_new_txt = "newstudent.txt"
  3. with open(file_txt) as file:
  4. for line in file:
  5. name,age,department,hobby = line.strip().split("\t")
  6. with open(file_new_txt,"a+") as file_new:
  7. file_new.write(name+"-"+age+"-"+department+"-"+hobby+"\n")

 txt文件是最常用的,但是也有其局限性,就是很难对文件中分隔开的内容进行标注,比如,对每一行数据都标明姓名:张奇,年龄:18这样,这时就需要用到json文件格式了

读写JSON文件

python中对json文件的读写需要导入json包,然后调用包内函数就可以完成读写了

  1. import json
  2. file_txt_path = "student.txt"
  3. file_json_path = "student.json"
  4. with open(file_txt_path) as file:
  5. for line in file:
  6. name,age,department,hobby = line.strip().split("\t")
  7. hobby = hobby.split(",")
  8. data = {
  9. "姓名":name,
  10. "年龄":age,
  11. "学院":department,
  12. "爱好":hobby
  13. }
  14. with open(file_json_path,"a+") as file_json:
  15. file_json.write(json.dumps(data,ensure_ascii=False))
  16. file_json.write(","+"\n")

这样就会获得这样一个json文件 

 

 但是这样的json文件格式是有问题的,我们需要在前面和后面加个[],并且把最后面那个","去掉

前后加[]倒是比较简单,如何去掉最后一个","倒是比较头疼,我暂时的思路是统计txt文件行数,在最后一行的时候就不写入","了

我们调用wc来统计文件行数:

  1. import json
  2. file_txt_path = "student.txt"
  3. file_json_path = "student.json"
  4. def _wc_count(file_name):
  5. """通过wc命令统计文件行数"""
  6. import subprocess
  7. out = subprocess.getoutput("wc -l %s" % file_name)
  8. return int(out.split()[0])
  9. count = _wc_count(file_txt_path)
  10. i = 0
  11. with open(file_json_path,"a+") as file:
  12. file.write("["+"\n")
  13. with open(file_txt_path) as file:
  14. for line in file:
  15. name,age,department,hobby = line.strip().split("\t")
  16. hobby = hobby.split(",")
  17. data = {
  18. "姓名":name,
  19. "年龄":age,
  20. "学院":department,
  21. "爱好":hobby
  22. }
  23. with open(file_json_path,"a+") as file_json:
  24. file_json.write(json.dumps(data,ensure_ascii=False))
  25. if(i < count):
  26. file_json.write(","+"\n")
  27. else:
  28. file_json.write("\n")
  29. file_json.write("]")
  30. i +=1

这样写入之后就变成了

 这样,将完成了json文件的写入

json文件的读会比较不太好用,因为它是无法一行行或者说一条条数据的读的,只能一次性将所有内容读到内存中,代码如下:

  1. import json
  2. file_json_path = "student.json"
  3. with open(file_json_path) as file:
  4. result = json.loads(file.read())
  5. #result是一个json对象
  6. for stu in result:
  7. hobby = ",".join(stu["爱好"])
  8. print(stu["姓名"]+"\t"+stu["年龄"]+"\t"+stu["学院"]+"\t"+hobby)

 但是上面也提到了,json文件只能一次性将所有内容读到内存中然后进行操作,当文件很大的时候这样说不合理的,尤其是现在的NLP领域,文件都有数十G甚至上百G,显然内存是不足以放下的,那么这样,我们就要用到一个可以逐行读取json对象的文件格式了

读写JSONL文件

jsonl文件的读写和json文件很相似,但是文件格式上有一丝丝的不同

图中将}后面的","去掉就是一个完整的jsonl文件格式

所以,我们写jsonl文件就十分方便了。代码如下

  1. import jsonlines
  2. file_txt_path = "student.txt"
  3. file_jsonl_path = "student.jsonl"
  4. with open(file_txt_path) as file:
  5. for line in file:
  6. name,age,department,hobby = line.strip().split("\t")
  7. hobby = hobby.split(",")
  8. data = {
  9. "姓名":name,
  10. "年龄":age,
  11. "学院":department,
  12. "爱好":hobby
  13. }
  14. with jsonlines.open(file_jsonl_path,mode="a") as file_jsonl:
  15. file_jsonl.write(data)

然后就是jsonl的读了,代码如下:

  1. import jsonlines
  2. file_jsonl_path = "student.jsonl"
  3. with open(file_jsonl_path) as file:
  4. for stu in jsonlines.Reader(file):
  5. hobby = ",".join(stu["爱好"])
  6. print(stu["姓名"]+"\t"+stu["年龄"]+"\t"+stu["学院"]+"\t"+hobby)

 这样,就可以实现一条条读取json对象了

遇到的问题

上面这些可以满足大部分对数据的读写了,但是我在工作中遇到了一个问题,就是json对象的删除情况,在json文件中,可以直接调用del来删除字段,但是中jsonl文件中,我无法删除指定字段,只能用复写新文件的方法来实现,翻阅了很久的资料都没有找到相应的方法,希望有大佬能在评论区指导一下

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索