<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
檔案是無處不在的,無論我們使用哪種程式語言,處理檔案對於每個程式設計師都是必不可少的
檔案處理是一種用於建立檔案、寫入資料和從中讀取資料的過程,Python 擁有豐富的用於處理不同檔案型別的包,從而使得我們可以更加輕鬆方便的完成檔案處理的工作
本文大綱:
在存取檔案的內容之前,我們需要開啟檔案。Python 提供了一個內建函數可以幫助我們以不同的模式開啟檔案。open()
函數接受兩個基本引數:檔名和模式
預設模式是“r”,它以唯讀方式開啟檔案。這些模式定義了我們如何存取檔案以及我們如何操作其內容。open()
函數提供了幾種不同的模式,我們將在後面逐一討論
下面我們通過 ’Python 之禪‘ 檔案來進行後面的討論學習
f = open('zen_of_python.txt', 'r') print(f.read()) f.close()
Output:
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
...
在上面的程式碼中,open()
函數以唯讀模式開啟文字檔案,這允許我們從檔案中獲取資訊而不能更改它。在第一行,open()
函數的輸出被賦值給一個代表文字檔案的物件 f
,在第二行中,我們使用 read()
方法讀取整個檔案並列印其內容,close()
方法在最後一行關閉檔案。需要注意,我們必須始終在處理完開啟的檔案後關閉它們以釋放我們的計算機資源並避免引發異常
在 Python 中,我們可以使用 with
上下文管理器來確保程式在檔案關閉後釋放使用的資源,即使發生異常也是如此
with open('zen_of_python.txt') as f: print(f.read())
Output:
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
...
上面的程式碼使用 with
語句建立了一個上下文,並繫結到變數 f
,所有檔案物件方法都可以通過該變數存取檔案物件。read()
方法在第二行讀取整個檔案,然後使用 print()
函數輸出檔案內容
當程式到達 with 語句塊上下文的末尾時,它會關閉檔案以釋放資源並確保其他程式可以正常呼叫它們。通常當我們處理不再需要使用的,需要立即關閉的物件(例如檔案、資料庫和網路連線)時,強烈推薦使用 with 語句
這裡需要注意的是,即使在退出 with 上下文管理器塊之後,我們也可以存取 f
變數,但是該檔案是已關閉狀態。讓我們嘗試一些檔案物件屬性,看看變數是否仍然存在並且可以存取:
print("Filename is '{}'.".format(f.name)) if f.closed: print("File is closed.") else: print("File isn't closed.")
Output:
Filename is 'zen_of_python.txt'.
File is closed.
但是此時是不可能從檔案中讀取內容或寫入檔案的,關閉檔案時,任何存取其內容的嘗試都會導致以下錯誤:
f.read()
Output:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
~AppDataLocalTemp/ipykernel_9828/3059900045.py in <module>
----> 1 f.read()
ValueError: I/O operation on closed file.
正如我們在前面提到的,我們需要在開啟檔案時指定模式。下表是 Python 中的不同的檔案模式:
模式說明
我們還可以指定以文字模式“t”、預設模式或二進位制模式“b”開啟檔案。讓我們看看如何使用簡單的語句複製影象檔案 dataquest_logo.png:
with open('dataquest_logo.png', 'rb') as rf: with open('data_quest_logo_copy.png', 'wb') as wf: for b in rf: wf.write(b)
上面的程式碼複製 Dataquest 徽標影象並將其儲存在同一路徑中。'rb' 模式以二進位制模式開啟檔案並進行讀取,而 'wb' 模式以文字模式開啟檔案以並行寫入
在 Python 中有多種讀取文字檔案的方法,下面我們介紹一些讀取文字檔案內容的有用方法
到目前為止,我們已經瞭解到可以使用 read()
方法讀取檔案的全部內容。如果我們只想從文字檔案中讀取幾個位元組怎麼辦,可以在 read()
方法中指定位元組數。讓我們嘗試一下:
with open('zen_of_python.txt') as f: print(f.read(17))
Output:
The Zen of Python
上面的簡單程式碼讀取 zen_of_python.txt 檔案的前 17 個位元組並將它們列印出來
有時一次讀取一行文字檔案的內容更有意義,在這種情況下,我們可以使用 readline() 方法
with open('zen_of_python.txt') as f: print(f.readline())
Output:
The Zen of Python, by Tim Peters
上面的程式碼返回檔案的第一行,如果我們再次呼叫該方法,它將返回檔案中的第二行等,如下:
with open('zen_of_python.txt') as f: print(f.readline()) print(f.readline()) print(f.readline()) print(f.readline())
Output:
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
這種有用的方法可以幫助我們以增量方式讀取整個檔案。
以下程式碼通過逐行迭代來輸出整個檔案,直到跟蹤我們正在讀取或寫入檔案的位置的檔案指標到達檔案末尾。當 readline()
方法到達檔案末尾時,它返回一個空字串
with open('zen_of_python.txt') as f: line = f.readline() while line: print(line, end='') line = f.readline()
Output:
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
上面的程式碼在 while
迴圈之外讀取檔案的第一行並將其分配給 line
變數。在 while
迴圈中,它列印儲存在 line
變數中的字串,然後讀取檔案的下一行。while
迴圈迭代該過程,直到 readline()
方法返回一個空字串。空字串在 while
迴圈中的計算結果為 False
,因此迭代過程終止
讀取文字檔案的另一個有用方法是 readlines()
方法,將此方法應用於檔案物件會返回包含檔案每一行的字串列表
with open('zen_of_python.txt') as f: lines = f.readlines()
讓我們檢查 lines 變數的資料型別,然後列印它:
print(type(lines)) print(lines)
Output:
<class 'list'>
['The Zen of Python, by Tim Petersn', 'n', 'Beaut...]
它是一個字串列表,其中列表中的每個專案都是文字檔案的一行,``n` 跳脫字元表示檔案中的新行。此外,我們可以通過索引或切片操作存取列表中的每個專案:
print(lines) print(lines[3:5]) print(lines[-1])
Output:
['The Zen of Python, by Tim Petersn', 'n', 'Beautiful is better than ugly.n', ... -- let's do more of those!"]
['Explicit is better than implicit.n', 'Simple is better than complex.n']
Namespaces are one honking great idea -- let's do more of those!
到目前為止,我們已經學會了如何使用常規文字檔案。但是有時資料採用 CSV 格式,資料專業人員通常會檢索所需資訊並操作 CSV 檔案的內容
接下來我們將使用 CSV 模組,CSV 模組提供了有用的方法來讀取儲存在 CSV 檔案中的逗號分隔值。我們現在就嘗試一下
import csv with open('chocolate.csv') as f: reader = csv.reader(f, delimiter=',') for row in reader: print(row)
Output:
['Company', 'Bean Origin or Bar Name', 'REF', 'Review Date', 'Cocoa Percent', 'Company Location', 'Rating', 'Bean Type', 'Country of Origin']
['A. Morin', 'Agua Grande', '1876', '2016', '63%', 'France', '3.75', 'Âxa0', 'Sao Tome']
['A. Morin', 'Kpime', '1676', '2015', '70%', 'France', '2.75', 'Âxa0', 'Togo']
['A. Morin', 'Atsane', '1676', '2015', '70%', 'France', '3', 'Âxa0', 'Togo']
['A. Morin', 'Akata', '1680', '2015', '70%', 'France', '3.5', 'Âxa0', 'Togo']
...
CSV 檔案的每一行形成一個列表,其中每個專案都可以輕鬆的被存取,如下所示:
import csv with open('chocolate.csv') as f: reader = csv.reader(f, delimiter=',') for row in reader: print("The {} company is located in {}.".format(row[0], row[5]))
Output:
The Company company is located in Company Location.
The A. Morin company is located in France.
The A. Morin company is located in France.
The A. Morin company is located in France.
The A. Morin company is located in France.
The Acalli company is located in U.S.A..
The Acalli company is located in U.S.A..
The Adi company is located in Fiji.
...
很多時候,使用列的名稱而不是使用它們的索引,這通常對專業人員來說更方便。在這種情況下,我們不使用 reader()
方法,而是使用返回字典物件集合的 DictReader()
方法
import csv with open('chocolate.csv') as f: dict_reader = csv.DictReader(f, delimiter=',') for row in dict_reader: print("The {} company is located in {}.".format(row['Company'], row['Company Location']))
Output:
The A. Morin company is located in France.
The A. Morin company is located in France.
The A. Morin company is located in France.
The A. Morin company is located in France.
The Acalli company is located in U.S.A..
The Acalli company is located in U.S.A..
The Adi company is located in Fiji.
...
我們主要用於儲存和交換資料的另一種流行檔案格式是 JSON,JSON 代表 JavaScript Object Notation,允許我們使用逗號分隔的鍵值對儲存資料
接下來我們將載入一個 JSON 檔案並將其作為 JSON 物件使用,而不是作為文字檔案,為此我們需要匯入 JSON 模組。然後在 with
上下文管理器中,我們使用了屬於 json 物件的 load()
方法,它載入檔案的內容並將其作為字典儲存在上下文變數中。
import json with open('movie.json') as f: content = json.load(f) print(content)
Output:
{'Title': 'Bicentennial Man', 'Release Date': 'Dec 17 1999', 'MPAA Rating': 'PG', 'Running Time min': 132, 'Distributor': 'Walt Disney Pictures', 'Source': 'Based on Book/Short Story', 'Major Genre': 'Drama', 'Creative Type': 'Science Fiction', 'Director': 'Chris Columbus', 'Rotten Tomatoes Rating': 38, 'IMDB Rating': 6.4, 'IMDB Votes': 28827}
讓我們檢查內容變數的資料型別:
print(type(content))
Output:
<class 'dict'>
它的資料型別是字典,因此我們可以方便的從中提取資料
print('{} directed by {}'.format(content['Title'], content['Director']))
Output:
Bicentennial Man directed by Chris Columbus
今天我們討論了 Python 中的檔案處理,重點是讀取檔案的內容。我們瞭解了 open()
內建函數、with
上下文管理器,以及如何讀取文字、CSV 和 JSON 等常見檔案型別。
以上就是一文搞懂Python讀取text,CSV,JSON檔案的方法的詳細內容,更多關於Python讀取檔案的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45