最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python3讀取文件的操作詳解

 更新時(shí)間:2022年07月25日 16:00:59   作者:Carl_奕然  
說(shuō)到fileinput,可能90%的碼農(nóng)表示沒(méi)用過(guò),甚至沒(méi)有聽說(shuō)過(guò)。但是,今天小編還是要介紹fileinput這個(gè)方法,因?yàn)樘嗡沽?,快跟隨小編一起學(xué)習(xí)學(xué)習(xí)吧

1、引言

小魚:小屌絲, 這段代碼為什么要開兩個(gè)線程?

小屌絲:因?yàn)槲乙x寫文件,還要備份文件,所以就開兩個(gè)線程了。

小魚:嗯,想法是對(duì)的,但是,還有一種簡(jiǎn)便的方法, 不需要開兩個(gè)線程就能搞得定的。

小屌絲:額…難道是with open?

小魚:不是。

小屌絲:那還有啥呢? 我咋想不起來(lái)了。

小魚:嗯,這個(gè)方法很奈斯,但是很少人使用,因?yàn)榇蟛糠执a農(nóng)都是直接open 文件的。

小屌絲:那你就別藏著掖著了,趕緊展示一下,讓我也長(zhǎng)長(zhǎng)見識(shí)。

2、 fileinput

說(shuō)到fileinput,可能90%的碼農(nóng)表示沒(méi)用過(guò),甚至沒(méi)有聽說(shuō)過(guò)。

這不奇怪,因?yàn)樵趐ython界,既然open可以走天下,何必要fileinput呢?。

但是,今天小魚還是要介紹fileinput這個(gè)方法,因?yàn)樘嗡沽恕?/p>

不止是香。是真香!

接下來(lái),就跟著小魚,一起fileinput,對(duì),就是這個(gè)feel。

2.1 方法介紹

2.1.1 基本用法

先來(lái)看一下fileinput的基本功能:

fileinput.filename():返回當(dāng)前被讀取的文件名。

—>在第一行被讀取之前,返回 None。

fileinput.fileno():返回以整數(shù)表示的當(dāng)前文件“文件描述符”。

—>當(dāng)未打開文件時(shí)(處在第一行和文件之間),返回 -1。

fileinput.lineno():返回已被讀取的累計(jì)行號(hào)。

—>在第一行被讀取之前,返回 0。在最后一個(gè)文件的最后一行被讀取之后,返回該行的行號(hào)。

fileinput.filelineno():返回當(dāng)前文件中的行號(hào)。

—>在第一行被讀取之前,返回 0。

—>在最后一個(gè)文件的最后一行被讀取之后,返回此文件中該行的行號(hào)。

2.1.2 進(jìn)階用法

fileinput.isfirstline():如果剛讀取的行是其所在文件的第一行則返回 True,否則返回 False。

fileinput.isstdin():如果最后讀取的行來(lái)自 sys.stdin 則返回 True,否則返回 False。

fileinput.nextfile():關(guān)閉當(dāng)前文件以使下次迭代將從下一個(gè)文件(如果存在)讀取第一行;不是從該文件讀取的行將不會(huì)被計(jì)入累計(jì)行數(shù)。直到下一個(gè)文件的第一行被讀取之后文件名才會(huì)改變。

—>在第一行被讀取之前,此函數(shù)將不會(huì)生效;它不能被用來(lái)跳過(guò)第一個(gè)文件。

—>在最后一個(gè)文件的最后一行被讀取之后,此函數(shù)將不再生效。

fileinput.close():關(guān)閉序列。

2.2 默認(rèn)讀取

代碼示例

# -*- coding:utf-8 -*-
# @Time   : 2022-07-23
# @Author : carl_DJ

import fileinput

'當(dāng) Python 腳本沒(méi)有傳入任何參數(shù)時(shí),fileinput 默認(rèn)會(huì)以 stdin 作為輸入源'
for line in fileinput.input():
    print(f'{line}')

運(yùn)行結(jié)果

你輸入的內(nèi)容,程序都會(huì)讀取并再輸出。

俗稱:復(fù)讀機(jī)

2.3 處理一個(gè)文件

代碼示例

# -*- coding:utf-8 -*-
# @Time   : 2022-07-23
# @Author : carl_DJ

import fileinput

'files 輸入打開文件的名稱即可'
with fileinput.input(files=('output.txt',)) as file:
    for line in file:
        print(f'{fileinput.filename()} 第{fileinput.lineno()}行:{line}',end='')

運(yùn)行結(jié)果

解析:

fileinput 有且僅有這兩種讀取模式:‘r’,‘rb’;

fileinput.input() 默認(rèn)使用 mode=‘r’ 的模式讀取文件,如果你的文件是二進(jìn)制的,可以使用mode=‘rb’ 模式。

2.4 處理批量文件

2.4.1 多文件序號(hào)連續(xù)排序

調(diào)用方法

fileinput.lineno()方法

代碼示例

# -*- coding:utf-8 -*-
# @Time   : 2022-07-23
# @Author : carl_DJ

import fileinput

'files 輸入打開文件的名稱即可'
with fileinput.input(files=('output.txt','input.txt')) as file:
    for line in file:
        #fileinput.lineno() 把兩個(gè)文件的整合陳一個(gè)文件對(duì)象file,需要排序輸出
        print(f'{fileinput.filename()} 第{fileinput.lineno()}行: {line}', end='')
        
        # fileinput.filelineno()兩個(gè)文件單獨(dú)讀取,需要單獨(dú)排序
        print(f'{fileinput.filename()} 第{fileinput.filelineno()}行: {line}', end='')

運(yùn)行結(jié)果

2.4.2 多文件序號(hào)單獨(dú)排序

調(diào)用方法

fileinput.filelineno()方法

代碼示例

# -*- coding:utf-8 -*-
# @Time   : 2022-07-23
# @Author : carl_DJ

import fileinput

'files 輸入打開文件的名稱即可'
with fileinput.input(files=('test1.txt','test2.txt')) as file:
    for line in file:       
        # fileinput.filelineno()兩個(gè)文件單獨(dú)讀取,需要單獨(dú)排序
        print(f'{fileinput.filename()} 第{fileinput.filelineno()}行: {line}', end='')

運(yùn)行結(jié)果

2.4.3 與glob配合用法

在顏值的時(shí)代,上面的輸出樣式,已經(jīng)無(wú)法滿足我們的需要了,

于是乎,我們就想到了glob。

代碼示例

# -*- coding:utf-8 -*-
# @Time   : 2022-07-23
# @Author : carl_DJ

import fileinput
import glob

#glob 匹配te開頭的txt文件
for line in fileinput.input(glob.glob("te*.txt")):
    if fileinput.isfirstline():
        #輸出讀取文件
        print('='*10,f'讀取文件{fileinput.filename()}','='*10)
        #fileinput.filelineno()方法讀取
    print(str(fileinput.filelineno())+ ':'+line.upper(),end='')

運(yùn)行結(jié)果

就這顏值,哪個(gè)小姐姐能不喜歡呢。

2.5 讀取與備份

調(diào)用方法

fileinput.input 的backup 參數(shù),可以指定備份的后綴名,比如 .bak

代碼示例

# -*- coding:utf-8 -*-
# @Time   : 2022-07-23
# @Author : carl_DJ

import fileinput

#觸發(fā)backup的動(dòng)作,源文件內(nèi)容被修改,對(duì)源文件進(jìn)行backup
with fileinput.input(files=("test1.txt",), backup=".bak",inplace=1) as file:
    for line in file:
        print(line.rstrip().replace('111111', '222222'))
        print(f'{fileinput.filename()} 第{fileinput.lineno()}行: {line}', end='')

運(yùn)行結(jié)果

2.5 重定向替換

解析

上面的例子, 用到了 inplace參數(shù),表示是否將標(biāo)準(zhǔn)輸出的結(jié)果寫回文件,默認(rèn)不取代

代碼示例:

# -*- coding:utf-8 -*-
# @Time   : 2022-07-23
# @Author : carl_DJ

import fileinput

#觸發(fā)backup的動(dòng)作,源文件內(nèi)容被修改,對(duì)源文件進(jìn)行backup
with fileinput.input(files=("test2.txt",), inplace=True) as file:
    print("[INFO] task is started...")
    for line in file:
        print(f'{fileinput.filename()} 第{fileinput.lineno()}行: {line}', end='')
    print("[INFO] task is closed...")

運(yùn)行結(jié)果

通過(guò)運(yùn)行結(jié)果,可以看到:

- 在 for 循環(huán)體內(nèi)的 print 內(nèi)容會(huì)寫回到原文件中了。

- 而在 for 循環(huán)體外的 print 則沒(méi)有變化。

2.6 進(jìn)階

2.6.1 openhook含義解析

在 fileinput.input() 中有一個(gè) openhook 的參數(shù),它支持用戶傳入自定義的對(duì)象讀取方法;

-如果沒(méi)有傳入任何勾子,fileinput 默認(rèn)使用的是 open 函數(shù);

2.6.2 方法介紹

fileinput 內(nèi)置了兩種勾子

1、fileinput.hook_compressed(filename, mode)

使用 gzip 和 bz2 模塊透明地打開 gzip 和 bzip2 壓縮的文件(通過(guò)擴(kuò)展名 ‘.gz’ 和 ‘.bz2’ 來(lái)識(shí)別);

如果文件擴(kuò)展名不是 ‘.gz’ 或 ‘.bz2’,文件會(huì)以正常方式打開(即使用 open() 并且不帶任何解壓操作);

使用示例: fi = fileinput.FileInput(openhook=fileinput.hook_compressed)

2、fileinput.hook_encoded(encoding, errors=None)

返回一個(gè)通過(guò) open() 打開每個(gè)文件的鉤子,使用給定的 encoding 和 errors 來(lái)讀取文件。

使用示例: fi = fileinput.FileInput(openhook=fileinput.hook_encoded(“utf-8”, “surrogateescape”))

2.6.3 示例實(shí)戰(zhàn)

假如我想要使用 fileinput 來(lái)讀取網(wǎng)絡(luò)上的文件,思路:

先使用 requests 下載文件到本地

再使用 open 去讀取它;

# -*- coding:utf-8 -*-
# @Time   : 2022-07-23
# @Author : carl_DJ

def online_open(url, mode):
    import requests
    r = requests.get(url) 
    filename = url.split("/")[-1]
    with open(filename,'w') as f1:
        f1.write(r.content.decode("utf-8"))
    f2 = open(filename,'r')
    return f2

直接將這個(gè)函數(shù)傳給 openhook 即可:

# -*- coding:utf-8 -*-
# @Time   : 2022-07-23
# @Author : carl_DJ

import fileinput
file_url = 'https://www.csdn.net/robots.txt'
with fileinput.input(files=(file_url,), openhook=online_open) as file:
    for line in file:
        print(line, end="")

代碼整合:

# -*- coding:utf-8 -*-
# @Time   : 2022-07-23
# @Author : carl_DJ
def online_open(url, mode):
    import requests
    r = requests.get(url)
    filename = url.split("/")[-1]
    with open(filename,'w') as f1:
        f1.write(r.content.decode("utf-8"))
    f2 = open(filename,'r')
    return f2

import fileinput
file_url = 'https://www.csdn.net/robots.txt'
with fileinput.input(files=(file_url,), openhook=online_open) as file:
    for line in file:
        print(line, end="")

運(yùn)行結(jié)果

3、總結(jié)

看到這里,今天的分享差不多就要結(jié)束了。

關(guān)于fileinput的介紹,也就介紹到這里。

fileinput本身是對(duì) open 函數(shù)的再次封裝,所以在讀取的部分,就比open顯得更專業(yè),更優(yōu)雅,這也是僅限于讀取的方面。

在寫的方面,相對(duì)于open,就不是那么的強(qiáng)悍。

歸根結(jié)底,fileinput還是一個(gè)不錯(cuò)的方法。值得你擁有。

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

相關(guān)文章

  • Tensorflow--取tensorf指定列的操作方式

    Tensorflow--取tensorf指定列的操作方式

    這篇文章主要介紹了Tensorflow--取tensorf指定列的操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • Python中的sorted函數(shù)使用解析

    Python中的sorted函數(shù)使用解析

    這篇文章主要介紹了Python中的sorted函數(shù)使用解析,sorted()函數(shù)可以對(duì)可迭代對(duì)象進(jìn)行排序,并且可以人為指定排序的依據(jù)以及方式,本文提供了解決與部分實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2023-10-10
  • python基礎(chǔ)之模塊的導(dǎo)入

    python基礎(chǔ)之模塊的導(dǎo)入

    這篇文章主要介紹了python模塊的導(dǎo)入,實(shí)例分析了Python中返回一個(gè)返回值與多個(gè)返回值的方法,需要的朋友可以參考下
    2021-10-10
  • Python&Matlab實(shí)現(xiàn)炫酷的3D旋轉(zhuǎn)圖

    Python&Matlab實(shí)現(xiàn)炫酷的3D旋轉(zhuǎn)圖

    這篇文章主要為大家介紹了如何利用Python和Matlab分別實(shí)現(xiàn)酷炫的3D旋轉(zhuǎn)圖,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-04-04
  • python 等差數(shù)列末項(xiàng)計(jì)算方式

    python 等差數(shù)列末項(xiàng)計(jì)算方式

    這篇文章主要介紹了python 等差數(shù)列末項(xiàng)計(jì)算方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-05-05
  • QT5 Designer 打不開的問(wèn)題及解決方法

    QT5 Designer 打不開的問(wèn)題及解決方法

    這篇文章主要介紹了QT5 Designer 打不開的問(wèn)題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • python使用multiprocessing的詳細(xì)方法

    python使用multiprocessing的詳細(xì)方法

    multiprocessing是Python標(biāo)準(zhǔn)庫(kù)中的一個(gè)模塊,用于實(shí)現(xiàn)多進(jìn)程編程,它提供了一種簡(jiǎn)單而高效的方式來(lái)利用多核處理器的能力,通過(guò)在多個(gè)進(jìn)程中同時(shí)執(zhí)行任務(wù),加快程序的執(zhí)行速度和提高系統(tǒng)的吞吐量,這篇文章主要介紹了python使用multiprocessing,需要的朋友可以參考下
    2024-03-03
  • Python實(shí)現(xiàn)數(shù)據(jù)庫(kù)并行讀取和寫入實(shí)例

    Python實(shí)現(xiàn)數(shù)據(jù)庫(kù)并行讀取和寫入實(shí)例

    本篇文章主要介紹了Python實(shí)現(xiàn)數(shù)據(jù)庫(kù)并行讀取和寫入實(shí)例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-06-06
  • Python利用pyodbc庫(kù)將文件信息插入Access數(shù)據(jù)庫(kù)

    Python利用pyodbc庫(kù)將文件信息插入Access數(shù)據(jù)庫(kù)

    在日常編程工作中,我們經(jīng)常需要處理文件和文件夾,所以本文將介紹如何使用Python編程語(yǔ)言和wxPython庫(kù)創(chuàng)建一個(gè)簡(jiǎn)單的文件瀏覽器界面,使用戶能夠選擇文件夾并將文件信息插入到Access數(shù)據(jù)庫(kù)中,需要的可以參考下
    2023-08-08
  • numpy.linspace函數(shù)具體使用詳解

    numpy.linspace函數(shù)具體使用詳解

    這篇文章主要介紹了numpy.linspace具體使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05

最新評(píng)論

巨野县| 博罗县| 三江| 兰西县| 泰和县| 中牟县| 陆良县| 霍州市| 亳州市| 龙泉市| 克什克腾旗| 龙游县| 宁河县| 南昌市| 榆林市| 永丰县| 新源县| 新邵县| 含山县| 和顺县| 淄博市| 灵山县| 黄骅市| 于田县| 迁安市| 闽侯县| 全南县| 萝北县| 逊克县| 临漳县| 德江县| 塔城市| 石门县| 蕉岭县| 延安市| 南华县| 汽车| 枣阳市| 栖霞市| 大余县| 隆林|