如何Python代碼快速解析、整理上萬(wàn)份數(shù)據(jù)文件-創(chuàng)新互聯(lián)

如何Python代碼快速解析、整理上萬(wàn)份數(shù)據(jù)文件,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

成都創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都做網(wǎng)站、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿(mǎn)足客戶(hù)于互聯(lián)網(wǎng)時(shí)代的新樂(lè)網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

在這個(gè)世界上,人們每天都在用 Python 完成著不同的工作。而文件操作,則是大家最常需要解決的任務(wù)之一。使用 Python,你可以輕松為他人生成精美的報(bào)表,也可以用短短幾行代碼快速解析、整理上萬(wàn)份數(shù)據(jù)文件。

當(dāng)我們編寫(xiě)與文件相關(guān)的代碼時(shí),通常會(huì)關(guān)注這些事情:我的代碼是不是足夠快?我的代碼有沒(méi)有事半功倍的完成任務(wù)? 在這篇文章中,我會(huì)與你分享與之相關(guān)的幾個(gè)編程建議。我會(huì)向你推薦一個(gè)被低估的 Python 標(biāo)準(zhǔn)庫(kù)模塊、演示一個(gè)讀取大文件的最佳方式、最后再分享我對(duì)函數(shù)設(shè)計(jì)的一點(diǎn)思考。

下面,讓我們進(jìn)入第一個(gè)“模塊安利”時(shí)間吧。

注意:因?yàn)椴煌僮飨到y(tǒng)的文件系統(tǒng)大不相同,本文的主要編寫(xiě)環(huán)境為 Mac OS/Linux 系統(tǒng),其中一些代碼可能并不適用于 Windows 系統(tǒng)。

建議一:使用 pathlib 模塊

如果你需要在 Python 里進(jìn)行文件處理,那么標(biāo)準(zhǔn)庫(kù)中的 osos.path兄弟倆一定是你無(wú)法避開(kāi)的兩個(gè)模塊。在這兩個(gè)模塊里,有著非常多與文件路徑處理、文件讀寫(xiě)、文件狀態(tài)查看相關(guān)的工具函數(shù)。

讓我用一個(gè)例子來(lái)展示一下它們的使用場(chǎng)景。有一個(gè)目錄里裝了很多數(shù)據(jù)文件,但是它們的后綴名并不統(tǒng)一,既有 .txt,又有 .csv。我們需要把其中以 .txt 結(jié)尾的文件都修改為 .csv 后綴名。

我們可以寫(xiě)出這樣一個(gè)函數(shù):

在學(xué)習(xí)過(guò)程中有什么不懂得可以加我的
python學(xué)習(xí)交流扣扣qun,784758214
群里有不錯(cuò)的學(xué)習(xí)視頻教程、開(kāi)發(fā)工具與電子書(shū)籍。
與你分享python企業(yè)當(dāng)下人才需求及怎么從零基礎(chǔ)學(xué)習(xí)好python,和學(xué)習(xí)什么內(nèi)容
1.  `import os`
2.  `import os.path`
5.  `def unify_ext_with_os_path(path):`
6.  `"""統(tǒng)一目錄下的 .txt 文件名后綴為 .csv`
7.  `"""`
8.  `for filename in os.listdir(path):`
9.  `basename, ext = os.path.splitext(filename)`
10.  `if ext ==  '.txt':`
11.  `abs_filepath = os.path.join(path, filename)`
12.  `os.rename(abs_filepath, os.path.join(path, f'{basename}.csv'))`

讓我們看看,上面的代碼一共用到了哪些與文件處理相關(guān)的函數(shù):

  • os.listdir(path):列出 path 目錄下的所有文件(含文件夾)

  • os.path.splitext(filename):切分文件名里面的基礎(chǔ)名稱(chēng)和后綴部分

  • os.path.join(path,filename):組合需要操作的文件名為絕對(duì)路徑

  • os.rename(...):重命名某個(gè)文件

上面的函數(shù)雖然可以完成需求,但說(shuō)句實(shí)話(huà),即使在寫(xiě)了很多年 Python 代碼后,我依然覺(jué)得:這些函數(shù)不光很難記,而且最終的成品代碼也不怎么討人喜歡。

使用 pathlib 模塊改寫(xiě)代碼

為了讓文件處理變得更簡(jiǎn)單,Python 在 3.4 版本引入了一個(gè)新的標(biāo)準(zhǔn)庫(kù)模塊:pathlib。它基于面向?qū)ο笏枷朐O(shè)計(jì),封裝了非常多與文件操作相關(guān)的功能。如果使用它來(lái)改寫(xiě)上面的代碼,結(jié)果會(huì)大不相同。

使用 pathlib 模塊后的代碼:

1.  `from pathlib import  Path`
3.  `def unify_ext_with_pathlib(path):`
4.  `for fpath in  Path(path).glob('*.txt'):`
5.  `fpath.rename(fpath.with_suffix('.csv'))`

和舊代碼相比,新函數(shù)只需要兩行代碼就完成了工作。而這兩行代碼主要做了這么幾件事:

  1. 首先使用 Path(path) 將字符串路徑轉(zhuǎn)換為 Path 對(duì)象

  2. 調(diào)用 .glob(‘*.txt’) 對(duì)路徑下所有內(nèi)容進(jìn)行模式匹配并以生成器方式返回,結(jié)果仍然是 Path 對(duì)象,所以我們可以接著做后面的操作

  3. 使用 .with_suffix(‘.csv’) 直接獲取使用新后綴名的文件全路徑

  4. 調(diào)用 .rename(target) 完成重命名

相比 osos.path,引入 pathlib 模塊后的代碼明顯更精簡(jiǎn),也更有整體統(tǒng)一感。所有文件相關(guān)的操作都是一站式完成。

其他用法

除此之外,pathlib 模塊還提供了很多有趣的用法。比如使用 / 運(yùn)算符來(lái)組合文件路徑:

1.  `# ???? 舊朋友:使用 os.path 模塊`
2.  `>>>  import os.path`
3.  `>>> os.path.join('/tmp',  'foo.txt')`
4.  `'/tmp/foo.txt'`
6.  `# ? 新潮流:使用 / 運(yùn)算符`
7.  `>>>  from pathlib import  Path`
8.  `>>>  Path('/tmp')  /  'foo.txt'`
9.  `PosixPath('/tmp/foo.txt')`

或者使用 .read_text() 來(lái)快速讀取文件內(nèi)容:

1.  `# 標(biāo)準(zhǔn)做法,使用 with open(...) 打開(kāi)文件`
2.  `>>>  with open('foo.txt')  as file:`
3.  `...  print(file.read())`
4.  `...`
5.  `foo`
7.  `# 使用 pathlib 可以讓這件事情變得更簡(jiǎn)單`
8.  `>>>  from pathlib import  Path`
9.  `>>>  print(Path('foo.txt').read_text())`
10.  `foo`

除了我在文章里介紹的這些,pathlib 模塊還提供了非常多有用的方法,強(qiáng)烈建議去 官方文檔 詳細(xì)了解一下。

如果上面這些都不足以讓你動(dòng)心,那么我再多給你一個(gè)使用 pathlib 的理由:PEP-519 里定義了一個(gè)專(zhuān)門(mén)用于“文件路徑”的新對(duì)象協(xié)議,這意味著從該 PEP 生效后的 Python 3.6 版本起,pathlib 里的 Path 對(duì)象,可以和以前絕大多數(shù)只接受字符串路徑的標(biāo)準(zhǔn)庫(kù)函數(shù)兼容使用:

1.  `>>> p =  Path('/tmp')`
2.  `# 可以直接對(duì) Path 類(lèi)型對(duì)象 p 進(jìn)行 join`
3.  `>>> os.path.join(p,  'foo.txt')`
4.  `'/tmp/foo.txt'`

所以,無(wú)需猶豫,趕緊把 pathlib 模塊用起來(lái)吧。

Hint: 如果你使用的是更早的 Python 版本,可以嘗試安裝 pathlib2 模塊 。

建議二:掌握如何流式讀取大文件

幾乎所有人都知道,在 Python 里讀取文件有一種“標(biāo)準(zhǔn)做法”:首先使用withopen(fine_name) 上下文管理器的方式獲得一個(gè)文件對(duì)象,然后使用 for 循環(huán)迭代它,逐行獲取文件里的內(nèi)容。

下面是一個(gè)使用這種“標(biāo)準(zhǔn)做法”的簡(jiǎn)單示例函數(shù):

1.  `def count_nine(fname):`
2.  `"""計(jì)算文件里包含多少個(gè)數(shù)字 '9'`
3.  `"""`
4.  `count =  0`
5.  `with open(fname)  as file:`
6.  `for line in file:`
7.  `count += line.count('9')`
8.  `return count`

假如我們有一個(gè)文件 small_file.txt,那么使用這個(gè)函數(shù)可以輕松計(jì)算出 9 的數(shù)量。

1.  `# small_file.txt`
2.  `feiowe9322nasd9233rl`
3.  `aoeijfiowejf8322kaf9a`
5.  `# OUTPUT: 3`
6.  `print(count_nine('small_file.txt'))`

為什么這種文件讀取方式會(huì)成為標(biāo)準(zhǔn)?這是因?yàn)樗袃蓚€(gè)好處:

  1. with 上下文管理器會(huì)自動(dòng)關(guān)閉打開(kāi)的文件描述符

  2. 在迭代文件對(duì)象時(shí),內(nèi)容是一行一行返回的,不會(huì)占用太多內(nèi)存

標(biāo)準(zhǔn)做法的缺點(diǎn)

但這套標(biāo)準(zhǔn)做法并非沒(méi)有缺點(diǎn)。如果被讀取的文件里,根本就沒(méi)有任何換行符,那么上面的第二個(gè)好處就不成立了。當(dāng)代碼執(zhí)行到 forlineinfile時(shí),line 將會(huì)變成一個(gè)非常巨大的字符串對(duì)象,消耗掉非常可觀的內(nèi)存。

讓我們來(lái)做個(gè)試驗(yàn):有一個(gè) 5GB 大的文件 big_file.txt,它里面裝滿(mǎn)了和 small_file.txt 一樣的隨機(jī)字符串。只不過(guò)它存儲(chǔ)內(nèi)容的方式稍有不同,所有的文本都被放在了同一行里:

1.  `# FILE: big_file.txt`
2.  `df2if283rkwefh...  <剩余  5GB  大小>  ...`

如果我們繼續(xù)使用前面的 count_nine 函數(shù)去統(tǒng)計(jì)這個(gè)大文件里 9 的個(gè)數(shù)。那么在我的筆記本上,這個(gè)過(guò)程會(huì)足足花掉 65 秒,并在執(zhí)行過(guò)程中吃掉機(jī)器 2GB 內(nèi)存 [注1]。

使用 read 方法分塊讀取

為了解決這個(gè)問(wèn)題,我們需要暫時(shí)把這個(gè)“標(biāo)準(zhǔn)做法”放到一邊,使用更底層的 file.read() 方法。與直接循環(huán)迭代文件對(duì)象不同,每次調(diào)用 file.read(chunk_size) 會(huì)直接返回從當(dāng)前位置往后讀取 chunk_size 大小的文件內(nèi)容,不必等待任何換行符出現(xiàn)。

所以,如果使用 file.read() 方法,我們的函數(shù)可以改寫(xiě)成這樣:

1.  `def count_nine_v2(fname):`
2.  `"""計(jì)算文件里包含多少個(gè)數(shù)字 '9',每次讀取 8kb`
3.  `"""`
4.  `count =  0`
5.  `block_size =  1024  *  8`
6.  `with open(fname)  as fp:`
7.  `while  True:`
8.  `chunk = fp.read(block_size)`
9.  `# 當(dāng)文件沒(méi)有更多內(nèi)容時(shí),read 調(diào)用將會(huì)返回空字符串 ''`
10.  `if  not chunk:`
11.  `break`
12.  `count += chunk.count('9')`
13.  `return count`

在新函數(shù)中,我們使用了一個(gè) while 循環(huán)來(lái)讀取文件內(nèi)容,每次最多讀取 8kb 大小,這樣可以避免之前需要拼接一個(gè)巨大字符串的過(guò)程,把內(nèi)存占用降低非常多。

利用生成器解耦代碼

假如我們?cè)谟懻摰牟皇?Python,而是其他編程語(yǔ)言。那么可以說(shuō)上面的代碼已經(jīng)很好了。但是如果你認(rèn)真分析一下 count_nine_v2 函數(shù),你會(huì)發(fā)現(xiàn)在循環(huán)體內(nèi)部,存在著兩個(gè)獨(dú)立的邏輯:數(shù)據(jù)生成(read 調(diào)用與 chunk 判斷)數(shù)據(jù)消費(fèi)。而這兩個(gè)獨(dú)立邏輯被耦合在了一起。

為了提升復(fù)用能力,我們可以定義一個(gè)新的 chunked_file_reader 生成器函數(shù),由它來(lái)負(fù)責(zé)所有與“數(shù)據(jù)生成”相關(guān)的邏輯。這樣 count_nine_v3 里面的主循環(huán)就只需要負(fù)責(zé)計(jì)數(shù)即可。

1.  `def chunked_file_reader(fp, block_size=1024  *  8):`
2.  `"""生成器函數(shù):分塊讀取文件內(nèi)容`
3.  `"""`
4.  `while  True:`
5.  `chunk = fp.read(block_size)`
6.  `# 當(dāng)文件沒(méi)有更多內(nèi)容時(shí),read 調(diào)用將會(huì)返回空字符串 ''`
7.  `if  not chunk:`
8.  `break`
9.  `yield chunk`
12.  `def count_nine_v3(fname):`
13.  `count =  0`
14.  `with open(fname)  as fp:`
15.  `for chunk in chunked_file_reader(fp):`
16.  `count += chunk.count('9')`
17.  `return count`

進(jìn)行到這一步,代碼似乎已經(jīng)沒(méi)有優(yōu)化的空間了,但其實(shí)不然。iter(iterable) 是一個(gè)用來(lái)構(gòu)造迭代器的內(nèi)建函數(shù),但它還有一個(gè)更少人知道的用法。當(dāng)我們使用 iter(callable,sentinel) 的方式調(diào)用它時(shí),會(huì)返回一個(gè)特殊的對(duì)象,迭代它將不斷產(chǎn)生可調(diào)用對(duì)象 callable 的調(diào)用結(jié)果,直到結(jié)果為 setinel 時(shí),迭代終止。

1.  `def chunked_file_reader(file, block_size=1024  *  8):`
2.  `"""生成器函數(shù):分塊讀取文件內(nèi)容,使用 iter 函數(shù)`
3.  `"""`
4.  `# 首先使用 partial(fp.read, block_size) 構(gòu)造一個(gè)新的無(wú)需參數(shù)的函數(shù)`
5.  `# 循環(huán)將不斷返回 fp.read(block_size) 調(diào)用結(jié)果,直到其為 '' 時(shí)終止`
6.  `for chunk in iter(partial(file.read, block_size),  ''):`
7.  `yield chunk`

最終,只需要兩行代碼,我們就完成了一個(gè)可復(fù)用的分塊文件讀取函數(shù)。那么,這個(gè)函數(shù)在性能方面的表現(xiàn)如何呢?

和一開(kāi)始的 2GB 內(nèi)存/耗時(shí) 65 秒 相比,使用生成器的版本只需要 7MB 內(nèi)存 / 12 秒 就能完成計(jì)算。效率提升了接近 4 倍,內(nèi)存占用更是不到原來(lái)的 1%。

建議三:設(shè)計(jì)接受文件對(duì)象的函數(shù)

統(tǒng)計(jì)完文件里的 “9” 之后,讓我們換一個(gè)需求?,F(xiàn)在,我想要統(tǒng)計(jì)每個(gè)文件里出現(xiàn)了多少個(gè)英文元音字母(aeiou)。只要對(duì)之前的代碼稍作調(diào)整,很快就可以寫(xiě)出新函數(shù) count_vowels。

在學(xué)習(xí)過(guò)程中有什么不懂得可以加我的
python學(xué)習(xí)交流扣扣qun,784758214
群里有不錯(cuò)的學(xué)習(xí)視頻教程、開(kāi)發(fā)工具與電子書(shū)籍。
與你分享python企業(yè)當(dāng)下人才需求及怎么從零基礎(chǔ)學(xué)習(xí)好python,和學(xué)習(xí)什么內(nèi)容
1.  `def count_vowels(filename):`
2.  `"""統(tǒng)計(jì)某個(gè)文件中,包含元音字母(aeiou)的數(shù)量`
3.  `"""`
4.  `VOWELS_LETTERS =  {'a',  'e',  'i',  'o',  'u'}`
5.  `count =  0`
6.  `with open(filename,  'r')  as fp:`
7.  `for line in fp:`
8.  `for char in line:`
9.  `if char.lower()  in VOWELS_LETTERS:`
10.  `count +=  1`
11.  `return count`
14.  `# OUTPUT: 16`
15.  `print(count_vowels('small_file.txt'))`

和之前“統(tǒng)計(jì) 9”的函數(shù)相比,新函數(shù)變得稍微復(fù)雜了一些。為了保證程序的正確性,我需要為它寫(xiě)一些單元測(cè)試。但當(dāng)我準(zhǔn)備寫(xiě)測(cè)試時(shí),卻發(fā)現(xiàn)這件事情非常麻煩,主要問(wèn)題點(diǎn)如下:

  1. 函數(shù)接收文件路徑作為參數(shù),所以我們需要傳遞一個(gè)實(shí)際存在的文件

  2. 為了準(zhǔn)備測(cè)試用例,我要么提供幾個(gè)樣板文件,要么寫(xiě)一些臨時(shí)文件

  3. 而文件是否能被正常打開(kāi)、讀取,也成了我們需要測(cè)試的邊界情況

如果,你發(fā)現(xiàn)你的函數(shù)難以編寫(xiě)單元測(cè)試,那通常意味著你應(yīng)該改進(jìn)它的設(shè)計(jì)。上面的函數(shù)應(yīng)該如何改進(jìn)呢?答案是:讓函數(shù)依賴(lài)“文件對(duì)象”而不是文件路徑。

修改后的函數(shù)代碼如下:

1.  `def count_vowels_v2(fp):`
2.  `"""統(tǒng)計(jì)某個(gè)文件中,包含元音字母(aeiou)的數(shù)量`
3.  `"""`
4.  `VOWELS_LETTERS =  {'a',  'e',  'i',  'o',  'u'}`
5.  `count =  0`
6.  `for line in fp:`
7.  `for char in line:`
8.  `if char.lower()  in VOWELS_LETTERS:`
9.  `count +=  1`
10.  `return count`
13.  `# 修改函數(shù)后,打開(kāi)文件的職責(zé)被移交給了上層函數(shù)調(diào)用者`
14.  `with open('small_file.txt')  as fp:`
15.  `print(count_vowels_v2(fp))`

這個(gè)改動(dòng)帶來(lái)的主要變化,在于它提升了函數(shù)的適用面。因?yàn)?Python 是“鴨子類(lèi)型”的,雖然函數(shù)需要接受文件對(duì)象,但其實(shí)我們可以把任何實(shí)現(xiàn)了文件協(xié)議的 “類(lèi)文件對(duì)象(file-like object)” 傳入 count_vowels_v2 函數(shù)中。

而 Python 中有著非常多“類(lèi)文件對(duì)象”。比如 io 模塊內(nèi)的 StringIO 對(duì)象就是其中之一。它是一種基于內(nèi)存的特殊對(duì)象,擁有和文件對(duì)象幾乎一致的接口設(shè)計(jì)。

利用 StringIO,我們可以非常方便的為函數(shù)編寫(xiě)單元測(cè)試。

1.  `# 注意:以下測(cè)試函數(shù)需要使用 pytest 執(zhí)行`
2.  `import pytest`
3.  `from io import  StringIO`
6.  `@pytest.mark.parametrize(`
7.  `"content,vowels_count",  [`
8.  `# 使用 pytest 提供的參數(shù)化測(cè)試工具,定義測(cè)試參數(shù)列表`
9.  `# (文件內(nèi)容, 期待結(jié)果)`
10.  `('',  0),`
11.  `('Hello World!',  3),`
12.  `('HELLO WORLD!',  3),`
13.  `('你好,世界',  0),`
14.  `]`
15.  `)`
16.  `def test_count_vowels_v2(content, vowels_count):`
17.  `# 利用 StringIO 構(gòu)造類(lèi)文件對(duì)象 "file"`
18.  `file =  StringIO(content)`
19.  `assert count_vowels_v2(file)  == vowels_count`

使用 pytest 運(yùn)行測(cè)試可以發(fā)現(xiàn),函數(shù)可以通過(guò)所有的用例:

1.  `? pytest vowels_counter.py`
2.  `====== test session starts ======`
3.  `collected 4 items`
5.  `vowels_counter.py ...  [100%]`
7.  `======  4 passed in  0.06 seconds ======`

而讓編寫(xiě)單元測(cè)試變得更簡(jiǎn)單,并非修改函數(shù)依賴(lài)后的唯一好處。除了 StringIO 外,subprocess 模塊調(diào)用系統(tǒng)命令時(shí)用來(lái)存儲(chǔ)標(biāo)準(zhǔn)輸出的 PIPE 對(duì)象,也是一種“類(lèi)文件對(duì)象”。這意味著我們可以直接把某個(gè)命令的輸出傳遞給 count_vowels_v2 函數(shù)來(lái)計(jì)算元音字母數(shù):

1.  `import subprocess`
3.  `# 統(tǒng)計(jì) /tmp 下面所有一級(jí)子文件名(目錄名)有多少元音字母`
4.  `p = subprocess.Popen(['ls',  '/tmp'], stdout=subprocess.PIPE, encoding='utf-8')`
6.  `# p.stdout 是一個(gè)流式類(lèi)文件對(duì)象,可以直接傳入函數(shù)`
7.  `# OUTPUT: 42`
8.  `print(count_vowels_v2(p.stdout))`

正如之前所說(shuō),將函數(shù)參數(shù)修改為“文件對(duì)象”,大的好處是提高了函數(shù)的 適用面可組合性。通過(guò)依賴(lài)更為抽象的“類(lèi)文件對(duì)象”而非文件路徑,給函數(shù)的使用方式開(kāi)啟了更多可能,StringIO、PIPE 以及任何其他滿(mǎn)足協(xié)議的對(duì)象都可以成為函數(shù)的客戶(hù)。

不過(guò),這樣的改造并非毫無(wú)缺點(diǎn),它也會(huì)給調(diào)用方帶來(lái)一些不便。假如調(diào)用方就是想要使用文件路徑,那么就必須得自行處理文件的打開(kāi)操作。

如何編寫(xiě)兼容二者的函數(shù)

有沒(méi)有辦法即擁有“接受文件對(duì)象”的靈活性,又能讓傳遞文件路徑的調(diào)用方更方便?答案是:有,而且標(biāo)準(zhǔn)庫(kù)中就有這樣的例子。

打開(kāi)標(biāo)準(zhǔn)庫(kù)里的 xml.etree.ElementTree 模塊,翻開(kāi)里面的 ElementTree.parse 方法。你會(huì)發(fā)現(xiàn)這個(gè)方法即可以使用文件對(duì)象調(diào)用,也接受字符串的文件路徑。而它實(shí)現(xiàn)這一點(diǎn)的手法也非常簡(jiǎn)單易懂:

1.  `def parse(self, source, parser=None):`
2.  `"""*source* is a file name or file object, *parser* is an optional parser`
3.  `"""`
4.  `close_source =  False`
5.  `# 通過(guò)判斷 source 是否有 "read" 屬性來(lái)判定它是不是“類(lèi)文件對(duì)象”`
6.  `# 如果不是,那么調(diào)用 open 函數(shù)打開(kāi)它并負(fù)擔(dān)起在函數(shù)末尾關(guān)閉它的責(zé)任`
7.  `if  not hasattr(source,  "read"):`
8.  `source = open(source,  "rb")`
9.  `close_source =  True`

使用這種基于“鴨子類(lèi)型”的靈活檢測(cè)方式, count_vowels_v2 函數(shù)也同樣可以被改造得更方便,我在這里就不再重復(fù)啦。

如果你依然在編程的世界里迷茫,可以加入我們的Python學(xué)習(xí)扣qun:784758214,看看前輩們是如何學(xué)習(xí)的!交流經(jīng)驗(yàn)!自己是一名高級(jí)python開(kāi)發(fā)工程師,從基礎(chǔ)的python腳本到web開(kāi)發(fā)、爬蟲(chóng)、django、數(shù)據(jù)挖掘等,零基礎(chǔ)到項(xiàng)目實(shí)戰(zhàn)的資料都有整理。送給每一位python的小伙伴!分享一些學(xué)習(xí)的方法和需要注意的小細(xì)節(jié),點(diǎn)擊加入我們的 python學(xué)習(xí)者聚集地

文件操作我們?cè)谌粘9ぷ髦薪?jīng)常需要接觸的領(lǐng)域,使用更方便的模塊、利用生成器節(jié)約內(nèi)存以及編寫(xiě)適用面更廣的函數(shù),可以讓我們編寫(xiě)出更高效的代碼。

讓我們最后再總結(jié)一下吧:

  • 使用 pathlib 模塊可以簡(jiǎn)化文件和目錄相關(guān)的操作,并讓代碼更直觀

  • PEP-519 定義了表示“文件路徑”的標(biāo)準(zhǔn)協(xié)議,Path 對(duì)象實(shí)現(xiàn)了這個(gè)協(xié)議

  • 通過(guò)定義生成器函數(shù)來(lái)分塊讀取大文件可以節(jié)約內(nèi)存

  • 使用 iter(callable,sentinel) 可以在一些特定場(chǎng)景簡(jiǎn)化代碼

  • 難以編寫(xiě)測(cè)試的代碼,通常也是需要改進(jìn)的代碼

  • 讓函數(shù)依賴(lài)“類(lèi)文件對(duì)象”可以提升函數(shù)的適用面和可組合性

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。

本文標(biāo)題:如何Python代碼快速解析、整理上萬(wàn)份數(shù)據(jù)文件-創(chuàng)新互聯(lián)
標(biāo)題網(wǎng)址:http://bm7419.com/article32/ddhesc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、用戶(hù)體驗(yàn)、網(wǎng)站內(nèi)鏈、響應(yīng)式網(wǎng)站、網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站