# 1.打開文件 位於自動導入的模塊IO中,無需手動導入。 ``` f = open('D:\M\test.txt') ``` 若文件不存在,則報錯 ``` Traceback (most recent call last): File "d:\M\github\Python\Demo\t14.py ...
1.打開文件
位於自動導入的模塊IO中,無需手動導入。
f = open('D:\M\test.txt')
若文件不存在,則報錯
Traceback (most recent call last):
File "d:\M\github\Python\Demo\t14.py", line 1, in <module>
f = open('D:\M\test.txt')
^^^^^^^^^^^^^^^^^^^^^
OSError: [Errno 22] Invalid argument: 'D:\\M\test.txt'
1.1 文件模式
只指定文件名的話,會得到一個可讀文件對象。若想寫入文件,必須通過添加參數來指出。
'r' 以只讀方式打開文件。文件的指針將會放在文件的開頭,這是預設模式。
'w' 以寫入方式打開文件。如果文件存在則覆蓋,如果文件不存在則創建一個新文件。
'a' 以追加模式打開文件。如果文件存在,則在文件末尾追加寫入,如果文件不存在則創建一個新文件。
'x' 以獨占方式創建文件,如果文件已經存在則返回 FileExistsError 錯誤。
'b' 以二進位模式打開文件。
't' 以文本模式打開文件(預設模式)。
'+' 可讀寫模式(可與其他模式組合使用)。
-
預設模式為
rt
,將把文件視為Unicode文本,自動執行解碼和編碼,且預設使用UTF-8編碼。 -
可以使用關鍵字參數
encoding
和errors
。 -
若文件為聲音圖片視頻之類的,可以使用二進位模式來禁用與文本相關的功能。、
2.文件的基本方法
2.1 讀取和寫入
f.write
f = open('test.txt', 'w')
f.write('Hello')
f.close # 記得關閉
f = open('test.txt', 'r')
str1 = f.read(4) # 讀取前4個字元 指針到達第5個字元
print(str1)
str1 = f.read() # 從第五個字元開始讀取
print(str1)
>
Hell
o
若想讓指針回到起始位置,用f.seek(0)
f = open('test.txt', 'r')
str1 = f.read(4)
print(str1)
f.seek(0) # 指針回溯
str1 = f.read()
print(str1)
>
Hell
Hello
2.2 成行地讀取和寫入
2.2.1 讀取方法readline
可以不提供參數,讀取一行後返回
test.txt 文件內容為
註意:文件中每一行都有一個換行符,讀取時,換行符也會被讀取
f = open('test.txt', 'r')
str1 = f.readline()
str2 = f.readline()
print(str1)
print(str2)
運行結果
Hello
Bob
想要不讀取換行符,可用strip()
f = open('test.txt', 'r')
str1 = f.readline().strip()
str2 = f.readline().strip()
print(str1)
print(str2)
運行結果
Hello
Bob
可以指定讀取字元數量
f = open('test.txt', 'r')
str1 = f.readline(5)
print(str1)
> Hello
讀取文件所有行,以列表返回 readlines
f = open('test.txt', 'r')
str1 = f.readlines()
print(str1)
> ['Hello\n', 'Bob\n', 'bye']
預設狀態下,VSCode不會即時保存,需要先將test.txt保存,再運行程式
2.2.2 寫入方法 writeline
先擦除所有內容,然後再寫入
運行前,test.txt文件內容
f = open('test.txt', 'w')
f.writelines('good')
f.close
運行後
寫入時,不會自動添加換行符,需要自己添加,沒有writeline
方法,可以使用write
f = open('test.txt', 'w')
f.write('middle')
f.writelines('bad\n')
f.writelines('good')
f.close
運行結果
2.3 記得關閉文件!
可以使用 try/finally
語句,再finally中調用close
try:
f = open('test.txt', 'w')
f.write('middle')
f.writelines('bad\n')
f.writelines('good')
finally:
f.close
還可以使用with語句關閉
# 將文件對象賦給test
with open('test.txt', 'w') as test:
test.write('middle')
運行後文件自動關閉
3.迭代文件內容
3.1 每次一個字元
with open('test.txt', 'r') as f:
while True:
char = f.read(1)
if not char: break
print(char, end=' ')
文件內容:
運行結果
C h i n a
3.2 每次一行
文件內容
with open('test.txt', 'r') as f:
while True:
str = f.readline().strip() # 去掉換行符
if not str: break
print(str, end=' ')
> China is the best
3.3 讀取所有內容
with open('test.txt', 'r') as f:
str = f.read()
print(str, end=' ')
運行結果
China
is
the
best
3.4 延遲行迭代fileinput
fileinput 可以輕鬆地處理多個輸入流,包括文件、標準輸入流等,同時還支持行迭代和緩衝流處理。還可以對大型文件(幾個TB)進行處理。
常見的使用方式包括:
- 逐行讀取文件中的數據,例如上面提到的例子。
- 處理多個文件,例如通過 glob 模塊來指定需要處理的文件列表。
- 實現管道功能,例如通過 subprocess 模塊來實現將命令的輸出作為輸入流來處理。
文件內容
# 逐行讀取文件並統計出現次數
for line in fileinput.input('test.txt'):
key = line.strip()
counts[key] = counts.get(key, 0) + 1
# 輸出統計結果
for key, value in counts.items():
print(key, '--', value)
運行結果
1 -- 3
2 -- 2
3 -- 1
4 -- 1