Python 文件讀寫(xiě)的八大實(shí)用方法
Python作為一門(mén)強(qiáng)大的編程語(yǔ)言,不僅在數(shù)據(jù)處理、機(jī)器學(xué)習(xí)等領(lǐng)域大放異彩,其文件操作功能也非常強(qiáng)大且靈活。無(wú)論是讀取配置文件、處理日志文件,還是編寫(xiě)腳本進(jìn)行文件自動(dòng)化管理,Python都提供了豐富的方法。今天,我們就來(lái)探討Python文件讀寫(xiě)的8大實(shí)用方法,并通過(guò)實(shí)際代碼示例逐步深入。
1. 使用open函數(shù)讀取文件
在Python中,讀取文件最基本的方式是使用內(nèi)置的open函數(shù)。這個(gè)函數(shù)返回一個(gè)文件對(duì)象,你可以用它來(lái)讀取文件內(nèi)容。
# 打開(kāi)文件并讀取內(nèi)容
with open('example.txt', 'r', encoding='utf-8') as file:
content = file.read()
print(content)
解釋?zhuān)?/p>
- open('example.txt', 'r', encoding='utf-8'):打開(kāi)當(dāng)前目錄下的example.txt文件,模式'r'表示讀取模式,encoding='utf-8'指定文件編碼。
- with語(yǔ)句確保文件在讀取完畢后自動(dòng)關(guān)閉。
- file.read():讀取文件全部?jī)?nèi)容。
2. 按行讀取文件
對(duì)于大文件,一次性讀取全部?jī)?nèi)容可能會(huì)消耗大量?jī)?nèi)存。按行讀取是一個(gè)更好的選擇。
with open('example.txt', 'r', encoding='utf-8') as file:
for line in file:
print(line.strip()) # strip()去除行尾的換行符
解釋?zhuān)?/p>
- for line in file:逐行讀取文件內(nèi)容。
- line.strip():去除每行末尾的換行符。
3. 寫(xiě)入文件
寫(xiě)入文件同樣使用open函數(shù),但模式要改為'w'(寫(xiě)入)或'a'(追加)。
# 寫(xiě)入文件
with open('output.txt', 'w', encoding='utf-8') as file:
file.write('Hello, Python!\n')
file.write('Welcome to file operations.')
# 追加內(nèi)容到文件
with open('output.txt', 'a', encoding='utf-8') as file:
file.write('\nGoodbye, Python!')
解釋?zhuān)?/p>
- 'w'模式會(huì)覆蓋文件原有內(nèi)容,'a'模式會(huì)在文件末尾追加內(nèi)容。
- file.write():將字符串寫(xiě)入文件。
4. 使用readlines讀取所有行
readlines方法會(huì)讀取文件所有行,并返回一個(gè)包含每行內(nèi)容的列表。
with open('example.txt', 'r', encoding='utf-8') as file:
lines = file.readlines()
for line in lines:
print(line.strip())
解釋?zhuān)?/p>
- file.readlines():讀取所有行,每行作為列表的一個(gè)元素。
5. 寫(xiě)入多行
你可以使用writelines方法一次性寫(xiě)入多行內(nèi)容。
lines_to_write = ['First line.\n', 'Second line.\n', 'Third line.\n']
with open('output.txt', 'w', encoding='utf-8') as file:
file.writelines(lines_to_write)
解釋?zhuān)?/p>
- writelines接受一個(gè)字符串列表,每個(gè)字符串代表文件的一行。
6. 使用pickle模塊序列化對(duì)象
pickle模塊可以將Python對(duì)象序列化為字節(jié)流,然后寫(xiě)入文件,或者從文件中反序列化對(duì)象。
import pickle
# 序列化對(duì)象并寫(xiě)入文件
data = {'name': 'Alice', 'age': 30, 'city': 'New York'}
with open('data.pkl', 'wb') as file:
pickle.dump(data, file)
# 從文件中反序列化對(duì)象
with open('data.pkl', 'rb') as file:
loaded_data = pickle.load(file)
print(loaded_data)
解釋?zhuān)?/p>
- 'wb'和'rb'模式分別用于二進(jìn)制寫(xiě)入和讀取。
- pickle.dump(data, file):將data對(duì)象序列化并寫(xiě)入文件。
- pickle.load(file):從文件中反序列化對(duì)象。
7. 使用csv模塊處理CSV文件
CSV(逗號(hào)分隔值)文件是常見(jiàn)的數(shù)據(jù)存儲(chǔ)格式。Python的csv模塊提供了方便的接口來(lái)讀寫(xiě)CSV文件。
import csv
# 寫(xiě)入CSV文件
with open('data.csv', 'w', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerow(['Name', 'Age', 'City'])
writer.writerows([['Alice', 30, 'New York'], ['Bob', 25, 'Los Angeles']])
# 讀取CSV文件
with open('data.csv', 'r', encoding='utf-8') as file:
reader = csv.reader(file)
for row in reader:
print(row)
解釋?zhuān)?/p>
- csv.writer(file):創(chuàng)建一個(gè)寫(xiě)入器對(duì)象。
- writer.writerow(row)和writer.writerows(rows):寫(xiě)入一行或多行數(shù)據(jù)。
- csv.reader(file):創(chuàng)建一個(gè)讀取器對(duì)象。
- for row in reader:逐行讀取CSV文件內(nèi)容。
8. 使用json模塊處理JSON文件
JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式。Python的json模塊可以方便地進(jìn)行JSON數(shù)據(jù)的序列化和反序列化。
import json
# 序列化對(duì)象并寫(xiě)入JSON文件
data = {'name': 'Alice', 'age': 30, 'city': 'New York'}
with open('data.json', 'w', encoding='utf-8') as file:
json.dump(data, file, ensure_ascii=False, indent=4)
# 從JSON文件中反序列化對(duì)象
with open('data.json', 'r', encoding='utf-8') as file:
loaded_data = json.load(file)
print(loaded_data)
解釋?zhuān)?/p>
- json.dump(data, file, ensure_ascii=False, indent=4):將data對(duì)象序列化為JSON格式并寫(xiě)入文件,ensure_ascii=False確保非ASCII字符正確顯示,indent=4使輸出格式化。
- json.load(file):從文件中反序列化JSON數(shù)據(jù)。
實(shí)戰(zhàn)案例:日志文件分析
假設(shè)你有一個(gè)日志文件log.txt,內(nèi)容如下:
2023-10-01 10:00:00 INFO User logged in
2023-10-01 10:05:00 ERROR Invalid credentials
2023-10-01 10:10:00 INFO User logged out
你的任務(wù)是統(tǒng)計(jì)日志文件中每個(gè)日志級(jí)別的出現(xiàn)次數(shù)。
from collections import defaultdict
log_levels = defaultdict(int)
with open('log.txt', 'r', encoding='utf-8') as file:
for line in file:
timestamp, level, message = line.split(maxsplit=2)
log_levels[level] += 1
print("Log levels count:")
for level, count in log_levels.items():
print(f"{level}: {count}")
輸出:
Log levels count:
INFO: 2
ERROR: 1
分析:- 我們使用defaultdict(int)來(lái)統(tǒng)計(jì)每個(gè)日志級(jí)別的出現(xiàn)次數(shù)。- 通過(guò)line.split(maxsplit=2)將每行日志分割為時(shí)間戳、日志級(jí)別和消息三部分。- 遍歷文件,更新日志級(jí)別的計(jì)數(shù)。- 最后打印出每個(gè)日志級(jí)別的出現(xiàn)次數(shù)。
總結(jié)
本篇文章詳細(xì)介紹了Python文件讀寫(xiě)的8大實(shí)用方法,包括基本的文件讀寫(xiě)操作、逐行讀取、寫(xiě)入多行、使用pickle、csv和json模塊處理特定格式的文件。通過(guò)實(shí)際代碼示例,我們逐步深入,從簡(jiǎn)單到復(fù)雜,展示了每個(gè)概念是如何應(yīng)用的。最后,通過(guò)一個(gè)實(shí)戰(zhàn)案例——日志文件分析,進(jìn)一步鞏固了所學(xué)知識(shí)。