欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用python讀寫txt和json(jsonl)大文件的方法步驟

 更新時(shí)間:2023年12月14日 09:26:55   作者:又三郎丶  
在Python中讀取txt和json(jsonl)大文件并保存到字典是一項(xiàng)非常常見的操作,這篇文章主要給大家介紹了關(guān)于使用python讀寫txt和json(jsonl)大文件的方法步驟,需要的朋友可以參考下

前言

在深度學(xué)習(xí)方向,尤其是NLP領(lǐng)域,最重要的就是和海量的文字打交道,不管是讀取原始數(shù)據(jù)還是處理數(shù)據(jù)亦或是最終寫數(shù)據(jù),合理的讀寫文件是極為重要的,這篇博客用以記錄一下工作中學(xué)習(xí)到的對(duì)大文件讀寫的過(guò)程。

讀寫txt文本文件

最簡(jiǎn)單也是最常見的就是讀寫txt文本文件

讀寫txt文件直接調(diào)用python內(nèi)部庫(kù)的open和write函數(shù)就基本可以了,比如中student.txt文件中:

張奇    18    計(jì)算機(jī)學(xué)院    看書,打籃球,看電影
劉欣    19    計(jì)算機(jī)學(xué)院    唱歌,健身
杜航    18    計(jì)算機(jī)學(xué)院    動(dòng)漫,看書
盛蓉    20    外國(guó)語(yǔ)學(xué)院    唱歌,看書,美食
余杰    20    土木學(xué)院    唱歌,運(yùn)動(dòng),游戲
王某    19    土木學(xué)院    羽毛球,游戲
李某    20    外國(guó)語(yǔ)學(xué)院    動(dòng)漫,唱歌

其中分別為姓名,年齡,學(xué)院,興趣愛好,每類用一個(gè)制表符(\t)隔開,興趣愛好中間用英文逗號(hào)分隔開來(lái),然后用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è)新的文件中去,過(guò)程中我們可以用幾個(gè)list先將數(shù)據(jù)存起來(lái),也可以一邊讀一邊寫,但是一行行讀一行行寫小數(shù)據(jù)還好,當(dāng)文件過(guò)大時(shí)大量的文件io會(huì)話費(fèi)大量的時(shí)間,但是使用list全部存儲(chǔ)然后寫的話又會(huì)比較耗內(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文件是最常用的,但是也有其局限性,就是很難對(duì)文件中分隔開的內(nèi)容進(jìn)行標(biāo)注,比如,對(duì)每一行數(shù)據(jù)都標(biāo)明姓名:張奇,年齡:18這樣,這時(shí)就需要用到j(luò)son文件格式了

讀寫JSON文件

python中對(duì)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")
 

這樣就會(huì)獲得這樣一個(gè)json文件 

 但是這樣的json文件格式是有問(wèn)題的,我們需要在前面和后面加個(gè)[],并且把最后面那個(gè)","去掉

前后加[]倒是比較簡(jiǎn)單,如何去掉最后一個(gè)","倒是比較頭疼,我暫時(shí)的思路是統(tǒng)計(jì)txt文件行數(shù),在最后一行的時(shí)候就不寫入","了

我們調(diào)用wc來(lái)統(tǒng)計(jì)文件行數(shù):

import json
 
file_txt_path = "student.txt"
file_json_path = "student.json"
 
def _wc_count(file_name):
        """通過(guò)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文件的讀會(huì)比較不太好用,因?yàn)樗菬o(wú)法一行行或者說(shuō)一條條數(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對(duì)象
 
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í)候這樣說(shuō)不合理的,尤其是現(xiàn)在的NLP領(lǐng)域,文件都有數(shù)十G甚至上百G,顯然內(nèi)存是不足以放下的,那么這樣,我們就要用到一個(gè)可以逐行讀取json對(duì)象的文件格式了

讀寫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對(duì)象了

遇到的問(wèn)題

上面這些可以滿足大部分對(duì)數(shù)據(jù)的讀寫了,但是我在工作中遇到了一個(gè)問(wèn)題,就是json對(duì)象的刪除情況,在json文件中,可以直接調(diào)用del來(lái)刪除字段,但是中jsonl文件中,我無(wú)法刪除指定字段,只能用復(fù)寫新文件的方法來(lái)實(shí)現(xiàn),翻閱了很久的資料都沒(méi)有找到相應(yīng)的方法,希望有大佬能在評(píng)論區(qū)指導(dǎo)一下

總結(jié)

到此這篇關(guān)于使用python讀寫txt和json(jsonl)大文件的文章就介紹到這了,更多相關(guān)python讀寫txt和json大文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python中Tkinter 窗口之輸入框和文本框的實(shí)現(xiàn)

    python中Tkinter 窗口之輸入框和文本框的實(shí)現(xiàn)

    這篇文章主要介紹了python中Tkinter 窗口之輸入框和文本框的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • python實(shí)現(xiàn)人機(jī)猜拳小游戲

    python實(shí)現(xiàn)人機(jī)猜拳小游戲

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)人機(jī)猜拳小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • Python中的圖像處理之Python圖像平滑操作

    Python中的圖像處理之Python圖像平滑操作

    本文主要介紹在Python中調(diào)用OpenCV庫(kù)對(duì)圖像進(jìn)行圖像平滑濾波處理與圖像加噪處理,如雙邊濾波,高斯雙邊濾波,圖像加隨機(jī)噪聲等操作,對(duì)Python圖像平滑操作感興趣的朋友一起看看吧
    2022-06-06
  • Python批量加密Excel文件的實(shí)現(xiàn)示例

    Python批量加密Excel文件的實(shí)現(xiàn)示例

    在日常工作中,保護(hù)敏感數(shù)據(jù)是至關(guān)重要的,本文主要介紹了Python批量加密Excel文件的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • conda虛擬環(huán)境默認(rèn)路徑的修改方法

    conda虛擬環(huán)境默認(rèn)路徑的修改方法

    最近發(fā)現(xiàn)我linux系統(tǒng)中的/dev/root目錄利用率占用了100%,這對(duì)后面文件的操作帶來(lái)了一些麻煩,下面這篇文章主要給大家介紹了關(guān)于conda虛擬環(huán)境默認(rèn)路徑的修改方法,需要的朋友可以參考下
    2022-07-07
  • django中使用原生sql語(yǔ)句的方法步驟

    django中使用原生sql語(yǔ)句的方法步驟

    這篇文章主要介紹了django中使用原生sql語(yǔ)句的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Python?Django源碼運(yùn)行過(guò)程解析

    Python?Django源碼運(yùn)行過(guò)程解析

    這篇文章主要介紹了Python?Django源碼運(yùn)行過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • scrapy數(shù)據(jù)存儲(chǔ)在mysql數(shù)據(jù)庫(kù)的兩種方式(同步和異步)

    scrapy數(shù)據(jù)存儲(chǔ)在mysql數(shù)據(jù)庫(kù)的兩種方式(同步和異步)

    這篇文章主要介紹了scrapy數(shù)據(jù)存儲(chǔ)在mysql數(shù)據(jù)庫(kù)的兩種方式(同步和異步),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Python垃圾回收及Linux?Fork

    Python垃圾回收及Linux?Fork

    這篇文章主要介紹了Python垃圾回收及Linux?Forkm,Python垃圾回收主要以引用計(jì)數(shù)為主,分代回收為輔,而一個(gè)進(jìn)程調(diào)用fork()函數(shù)后,系統(tǒng)先給新的進(jìn)程分配資源,例如存儲(chǔ)數(shù)據(jù)和代碼的空間,下面來(lái)看文章具體介紹吧
    2022-01-01
  • python df遍歷的N種方式(小結(jié))

    python df遍歷的N種方式(小結(jié))

    本文主要介紹了python df遍歷的N種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07

最新評(píng)論