日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

Python學(xué)習(xí)之文件的讀取詳解_python

作者:渴望力量的哈士奇 ? 更新時(shí)間: 2022-05-26 編程語(yǔ)言

上一章節(jié) 我們學(xué)習(xí)了如何利用 open() 函數(shù)創(chuàng)建一個(gè)文件,以及如何在文件內(nèi)寫入內(nèi)容;今天我們就來(lái)了解一下如何將文件中的內(nèi)容讀取出去來(lái)的方法。

文件讀取的模式

模式 介紹
r (read 的縮寫) 讀取文件(返回的是字符串類型)
rb 二進(jìn)制形式讀取文件

注意:我們接觸文件的寫入與讀取都是使用的 字符串 類型,那么 集合、元組、列表等就不能寫入了么?嚴(yán)格來(lái)說(shuō)是不可以的,但是我們可以進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換轉(zhuǎn)為字符串呀 。寫入的時(shí)候轉(zhuǎn)為字符串類型,讀取的時(shí)候再轉(zhuǎn)為原來(lái)的數(shù)據(jù)類型即可。?嘿嘿嘿…

文件對(duì)象的讀取方法

方法名 參數(shù) 介紹 舉例
read 無(wú) 將文件內(nèi)容一次性全部獨(dú)取出來(lái),返回整個(gè)整個(gè)文件的字符串 f.read()
readlines 無(wú) 將文件內(nèi)容的每一行內(nèi)容切割成列表讀取,返回文件列表 f.readlines()
readline 無(wú) 將文件每一行內(nèi)容進(jìn)行讀取,一次返回一行,返回文件中的一行 f.readline()
mode 無(wú) open()函數(shù)的 mode屬性,調(diào)用可返回當(dāng)前文件模式 f.mode()
name 無(wú) 返回文件名稱 f.name()
closed 無(wú) 返回一個(gè) bool 類型,調(diào)用 closed() 函數(shù)可以知道文件是否關(guān)閉 f.closed()

使用 read() 函數(shù)一次性讀取文件全部?jī)?nèi)容

注意:下文演示的 Terminal 終端是在 read_test.py 文件路徑啟動(dòng)的 ipython 執(zhí)行的。

這是我們讀取 事先創(chuàng)建好的 read_test.py 文件的腳本

import os.path

current_path = os.getcwd()

file = open('read_test.py', 'r')
data = file.read()
file.close()

print(data)
print('***************************')
print(type(data))

read_test.py 文件內(nèi)容如下

# coding:utf-8

import os.path


current_path = os.getcwd()

file_path = os.path.join(current_path, 'test.txt')
file_test = open(file_path, 'w+', encoding='utf-8')
file_test.write('人生苦短 我用Python')
file_test.read()
file_test.close()

Terminal終端 執(zhí)行效果如下圖:

使用 readlines() 函數(shù) 讀取文件內(nèi)容

繼續(xù)上面的腳本我們使用 readlines() 函數(shù)

file = open('read_test.py', 'r')
data = file.readlines()
file.close()

print(data)
print('***************************')
print(type(data))

Terminal 終端 執(zhí)行的效果如下圖:

注意:區(qū)別于 print(data) ,直接打印 data ,顯示效果如下:

這里我們發(fā)現(xiàn)每一行和空行都會(huì)有一個(gè)換行符,如果我們需要讀取、處理每一行的內(nèi)容,空行與換行符會(huì)給我們?cè)斐珊艽蟮睦_。這里我們就可以利用到字符串的 strip() 函數(shù)加上 for 循環(huán) 就可以處理了。

_data = []

for i in data:
    temp = i.strip()
    if temp != '':
        _data.append(temp)
        
_data

# >>> 執(zhí)行結(jié)果如下圖:

使用 readline() 函數(shù) 逐行讀取文件內(nèi)容

上文我們提到 readline() 函數(shù) 會(huì)針對(duì)文件每一行內(nèi)容進(jìn)行讀取,一次返回一行;如果想要讀取下一行內(nèi)容,就需要再一次執(zhí)行 readline() 函數(shù);下面我們來(lái)看一下 演示案例:

file = open('read_test.py', 'r')
data = file.readline()

data

# >>> 執(zhí)行結(jié)果如下:
# >>> '# coding:utf-8\n'

data = file.readline()

data

# >>> 執(zhí)行結(jié)果如下:
# >>> '\n'

如下圖:

mode()、name()、closed() 函數(shù)演示

見下圖:

文件讀取小實(shí)戰(zhàn)

還記得我們上一章節(jié)的文件的創(chuàng)建于寫入里面的實(shí)戰(zhàn)小案例么?今天我們就在上一章節(jié)的實(shí)戰(zhàn)小案例上進(jìn)行一個(gè)補(bǔ)充,拓展一下我們關(guān)于讀取文件的功能(函數(shù))

在進(jìn)行 文件讀取小實(shí)戰(zhàn)之前,我們先來(lái)了解一下 wiht open() 函數(shù),如下。

with open() 函數(shù)

前文我們了解到,如果想要讀取一個(gè)文件就需要先使用 open() 函數(shù),打開文件并賦予其打開的模式,最后必須要要操作 close() 函數(shù);這就是一個(gè)完整的讀取文件內(nèi)容的一個(gè)步驟,但是這個(gè)步驟過(guò)于繁瑣不說(shuō),在文件不存在或者沒(méi)有執(zhí)行 close() 函數(shù)的情況下,還會(huì)拋出一個(gè)IOError的錯(cuò)誤,并且給出錯(cuò)誤碼和詳細(xì)的信息告訴你文件不存在,示例如下:

每次如果都按照如上最終方案去寫的話,實(shí)在太繁瑣。Python引入了with語(yǔ)句來(lái)自動(dòng)幫我們調(diào)用close()方法

重點(diǎn):!!!with 的作用就是自動(dòng)調(diào)用close()方法 !!!

# 使用方法:
with open('/path/to/file', 'r') as f:
	print(f.read())
    
# >>> 相較于單獨(dú)使用 open() 函數(shù),是不是代碼更佳簡(jiǎn)潔,并且不必調(diào)用f.close()方法了呢?

利用with open() 函數(shù)讀取文件的小實(shí)戰(zhàn)

import os


def create_package(path):
    if os.path.exists(path):
        raise Exception('%s 已經(jīng)存在,不可創(chuàng)建' % path)
    else:
        os.mkdir(path)

    init_path = os.path.join(path, '__init__.py')
    file_init = open(init_path, 'w', encoding='utf-8')
    file_init.write('# coding:utf-8\n')
    file_init.close()


class Open(object):
    def __init__(self, path, mode='w', is_return=True):     # 這里的 is_return 定義的是換行的意思,結(jié)合下文的 message 理解
        self.path = path
        self.mode = mode
        self.is_return = is_return

    def write(self, message):
        file_test = open(self.path, mode=self.mode)
        if self.is_return:      # 如果返回 Ture 則 在 message 后,增加換行符
            message = '%s\n' % message
        file_test.write(message)
        file_test.close()

    def read(self, is_strip=True):  # is_strip 用于判斷每一行結(jié)尾的換行符將其去掉

        result = []                 # 定義一個(gè)空列表,用來(lái)讀取每一行內(nèi)容

        with open(self.path, mode=self.mode) as file:
            data = file.readlines() # 文件對(duì)象讀取文件內(nèi)容一但脫離 with open() 函數(shù),就會(huì)自動(dòng)執(zhí)行 close() 函數(shù) 關(guān)閉文件

        for line in data:           # for循環(huán)遍歷data ,若讀取的那一行內(nèi)容不為空且如果存在'\n'符,去掉'\n'符然后加入result列表
            if is_strip:            # is_strip 默認(rèn)就是 True
                temp = line.strip()
                if temp != '':
                    result.append(temp)
            else:                   # 如果讀取的那一行不為空,加入result列表
                if line != '':
                    result.append(line)
        return result


if __name__ == '__main__':
    current_path = os.getcwd()
    open_path = os.path.join(current_path, 'test.txt')
    open_test = Open(open_path, mode='r')
    data = open_test.read()
    # data = open_test.read(is_strip=False)
    print(data)

執(zhí)行結(jié)果如下:

原文鏈接:https://blog.csdn.net/weixin_42250835/article/details/123698940

欄目分類
最近更新