使用python讀寫txt和json(jsonl)大文件的方法步驟
前言
在深度學(xué)習(xí)方向,尤其是NLP領(lǐng)域,最重要的就是和海量的文字打交道,不管是讀取原始數(shù)據(jù)還是處理數(shù)據(jù)亦或是最終寫數(shù)據(jù),合理的讀寫文件是極為重要的,這篇博客用以記錄一下工作中學(xué)習(xí)到的對大文件讀寫的過程。
讀寫txt文本文件
最簡單也是最常見的就是讀寫txt文本文件
讀寫txt文件直接調(diào)用python內(nèi)部庫的open和write函數(shù)就基本可以了,比如中student.txt文件中:
張奇 18 計(jì)算機(jī)學(xué)院 看書,打籃球,看電影
劉欣 19 計(jì)算機(jī)學(xué)院 唱歌,健身
杜航 18 計(jì)算機(jī)學(xué)院 動漫,看書
盛蓉 20 外國語學(xué)院 唱歌,看書,美食
余杰 20 土木學(xué)院 唱歌,運(yùn)動,游戲
王某 19 土木學(xué)院 羽毛球,游戲
李某 20 外國語學(xué)院 動漫,唱歌
其中分別為姓名,年齡,學(xué)院,興趣愛好,每類用一個(gè)制表符(\t)隔開,興趣愛好中間用英文逗號分隔開來,然后用open打開txt文件并將內(nèi)容讀取打印
file_txt = "student.txt"
with open(file_txt) as file:
for line in file:
name,age,department,hobby = line.strip().split("\t")
print(name,age,department,hobby)同樣,也可以用write函數(shù)寫到一個(gè)新的文件中去,過程中我們可以用幾個(gè)list先將數(shù)據(jù)存起來,也可以一邊讀一邊寫,但是一行行讀一行行寫小數(shù)據(jù)還好,當(dāng)文件過大時(shí)大量的文件io會話費(fèi)大量的時(shí)間,但是使用list全部存儲然后寫的話又會比較耗內(nèi)存,各有優(yōu)劣,看情況使用
使用list:
file_txt = "student.txt"
file_new_txt = "newstudent.txt"
stu = []
with open(file_txt) as file:
for line in file:
name,age,department,hobby = line.strip().split("\t")
stu.append(name+"-"+age+"-"+department+"-"+hobby)
with open(file_new_txt,"a+") as file:
for student in stu:
file.write(student+"\n")
邊讀邊寫:
file_txt = "student.txt"
file_new_txt = "newstudent.txt"
with open(file_txt) as file:
for line in file:
name,age,department,hobby = line.strip().split("\t")
with open(file_new_txt,"a+") as file_new:
file_new.write(name+"-"+age+"-"+department+"-"+hobby+"\n")
txt文件是最常用的,但是也有其局限性,就是很難對文件中分隔開的內(nèi)容進(jìn)行標(biāo)注,比如,對每一行數(shù)據(jù)都標(biāo)明姓名:張奇,年齡:18這樣,這時(shí)就需要用到j(luò)son文件格式了
讀寫JSON文件
python中對json文件的讀寫需要導(dǎo)入json包,然后調(diào)用包內(nèi)函數(shù)就可以完成讀寫了
import json
file_txt_path = "student.txt"
file_json_path = "student.json"
with open(file_txt_path) as file:
for line in file:
name,age,department,hobby = line.strip().split("\t")
hobby = hobby.split(",")
data = {
"姓名":name,
"年齡":age,
"學(xué)院":department,
"愛好":hobby
}
with open(file_json_path,"a+") as file_json:
file_json.write(json.dumps(data,ensure_ascii=False))
file_json.write(","+"\n")
這樣就會獲得這樣一個(gè)json文件

但是這樣的json文件格式是有問題的,我們需要在前面和后面加個(gè)[],并且把最后面那個(gè)","去掉
前后加[]倒是比較簡單,如何去掉最后一個(gè)","倒是比較頭疼,我暫時(shí)的思路是統(tǒng)計(jì)txt文件行數(shù),在最后一行的時(shí)候就不寫入","了
我們調(diào)用wc來統(tǒng)計(jì)文件行數(shù):
import json
file_txt_path = "student.txt"
file_json_path = "student.json"
def _wc_count(file_name):
"""通過wc命令統(tǒng)計(jì)文件行數(shù)"""
import subprocess
out = subprocess.getoutput("wc -l %s" % file_name)
return int(out.split()[0])
count = _wc_count(file_txt_path)
i = 0
with open(file_json_path,"a+") as file:
file.write("["+"\n")
with open(file_txt_path) as file:
for line in file:
name,age,department,hobby = line.strip().split("\t")
hobby = hobby.split(",")
data = {
"姓名":name,
"年齡":age,
"學(xué)院":department,
"愛好":hobby
}
with open(file_json_path,"a+") as file_json:
file_json.write(json.dumps(data,ensure_ascii=False))
if(i < count):
file_json.write(","+"\n")
else:
file_json.write("\n")
file_json.write("]")
i +=1
這樣寫入之后就變成了

這樣,將完成了json文件的寫入
json文件的讀會比較不太好用,因?yàn)樗菬o法一行行或者說一條條數(shù)據(jù)的讀的,只能一次性將所有內(nèi)容讀到內(nèi)存中,代碼如下:
import json
file_json_path = "student.json"
with open(file_json_path) as file:
result = json.loads(file.read())
#result是一個(gè)json對象
for stu in result:
hobby = ",".join(stu["愛好"])
print(stu["姓名"]+"\t"+stu["年齡"]+"\t"+stu["學(xué)院"]+"\t"+hobby)
但是上面也提到了,json文件只能一次性將所有內(nèi)容讀到內(nèi)存中然后進(jìn)行操作,當(dāng)文件很大的時(shí)候這樣說不合理的,尤其是現(xiàn)在的NLP領(lǐng)域,文件都有數(shù)十G甚至上百G,顯然內(nèi)存是不足以放下的,那么這樣,我們就要用到一個(gè)可以逐行讀取json對象的文件格式了
讀寫JSONL文件
jsonl文件的讀寫和json文件很相似,但是文件格式上有一絲絲的不同

圖中將}后面的","去掉就是一個(gè)完整的jsonl文件格式
所以,我們寫jsonl文件就十分方便了。代碼如下
import jsonlines
file_txt_path = "student.txt"
file_jsonl_path = "student.jsonl"
with open(file_txt_path) as file:
for line in file:
name,age,department,hobby = line.strip().split("\t")
hobby = hobby.split(",")
data = {
"姓名":name,
"年齡":age,
"學(xué)院":department,
"愛好":hobby
}
with jsonlines.open(file_jsonl_path,mode="a") as file_jsonl:
file_jsonl.write(data)
然后就是jsonl的讀了,代碼如下:
import jsonlines
file_jsonl_path = "student.jsonl"
with open(file_jsonl_path) as file:
for stu in jsonlines.Reader(file):
hobby = ",".join(stu["愛好"])
print(stu["姓名"]+"\t"+stu["年齡"]+"\t"+stu["學(xué)院"]+"\t"+hobby)
這樣,就可以實(shí)現(xiàn)一條條讀取json對象了
遇到的問題
上面這些可以滿足大部分對數(shù)據(jù)的讀寫了,但是我在工作中遇到了一個(gè)問題,就是json對象的刪除情況,在json文件中,可以直接調(diào)用del來刪除字段,但是中jsonl文件中,我無法刪除指定字段,只能用復(fù)寫新文件的方法來實(shí)現(xiàn),翻閱了很久的資料都沒有找到相應(yīng)的方法,希望有大佬能在評論區(qū)指導(dǎo)一下
總結(jié)
到此這篇關(guān)于使用python讀寫txt和json(jsonl)大文件的文章就介紹到這了,更多相關(guān)python讀寫txt和json大文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python讀取eml文件并用正則表達(dá)式匹配郵箱的代碼
今天接到一個(gè)需求有一個(gè)同事離職了,但是留下了非常多的郵件,我需要將他的郵件進(jìn)行分類,只要郵件中以@xxx.com結(jié)尾的存放在文件夾中,否則放在另一個(gè)文件夾中,這篇文章主要介紹了python讀取eml文件并用正則匹配郵箱,需要的朋友可以參考下2022-11-11
python GUI庫圖形界面開發(fā)之PyQt5狀態(tài)欄控件QStatusBar詳細(xì)使用方法實(shí)例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5狀態(tài)欄控件QStatusBar詳細(xì)使用方法實(shí)例,需要的朋友可以參考下2020-02-02
Python實(shí)現(xiàn)自動生成高質(zhì)量文章的示例代碼
在當(dāng)今內(nèi)容為王的時(shí)代,自媒體創(chuàng)作者們面臨著巨大的內(nèi)容生產(chǎn)壓力,每天需要產(chǎn)出大量高質(zhì)量文章來吸引讀者,下面我們就來看看如何僅用50行Python代碼打造一個(gè)自動文章生成器吧2025-06-06
Python探針完成調(diào)用庫的數(shù)據(jù)提取
這篇文章主要介紹了Python探針完成調(diào)用庫的數(shù)據(jù)提取,Python中可以通過sys.meta_path來實(shí)現(xiàn)import?hook的功能,下文詳細(xì)資料介紹,需要的小伙伴可以參考一下2022-05-05
解決Python獲取文件提示找不到指定路徑can‘t?open?file?'area.py':
這篇文章主要給大家介紹了關(guān)于如何解決Python獲取文件提示找不到指定路徑can‘t?open?file?'area.py':[Errno?2]?No?such?file?or?directory的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
Python 列表推導(dǎo)式與字典推導(dǎo)式的實(shí)現(xiàn)
本文主要介紹了Python 列表推導(dǎo)式與字典推導(dǎo)式的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12

