一、方法介紹
Python open() 方法用于打開一個文件,并返回文件對象,在對文件進行處理過程都需要使用到這個函數,如果該文件無法被打開,會拋出 OSError。
注意: 使用 open() 方法一定要保證關閉文件對象,即調用 close() 方法。
1
#
open函數的語法格式
2
3
open(file, mode=
'
r
'
, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=
None)
4
file: 必需,文件路徑(相對或者絕對路徑)。
5
mode: 可選,文件打開模式
6
buffering: 設置緩沖
7
errors: 報錯級別
8
newline: 區分換行符
9
closefd: 傳入的file參數類型
mode的參數有:
|
模式
|
描述
|
|
r
|
以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。
|
|
w
|
打開一個文件只用于寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
|
|
a
|
打開一個文件用于追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之后。如果該文件不存在,創建新文件進行寫入。
|
|
rb
|
以二進制格式打開一個文件用于只讀。文件指針將會放在文件的開頭。這是默認模式。
|
|
r+
|
打開一個文件用于讀寫。文件指針將會放在文件的開頭。先讀后寫才是安全的
|
|
rb+
|
以二進制格式打開一個文件用于讀寫。文件指針將會放在文件的開頭。
|
|
w+
|
打開一個文件用于讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件
|
|
wb+
|
以二進制格式打開一個文件用于讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
|
|
wb
|
以二進制格式打開一個文件只用于寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
|
|
ab
|
以二進制格式打開一個文件用于追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之后。如果該文件不存在,創建新文件進行寫入。
|
|
a+
|
打開一個文件用于讀寫。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在,創建新文件用于讀寫。
|
|
ab+
|
以二進制格式打開一個文件用于追加。如果該文件已存在,文件指針將會放在文件的結尾。如果該文件不存在,創建新文件用于讀寫。
|
file中的常用方法:
|
方法
|
描述
|
|
file.close()
|
關閉文件。關閉后文件不能再進行讀寫操作。
|
|
file.flush()
|
刷新文件內部緩沖,直接把內部緩沖區的數據立刻寫入文件, 而不是被動的等待輸出緩沖區寫入。
|
|
file.next()
|
返回文件下一行
|
|
file.read([size])
|
從文件讀取指定的字節數,如果未給定或為負則讀取所有
|
|
file.readline([size])
|
讀取整行,包括 "\n" 字符。
|
|
file.readlines([sizehint])
|
讀取所有行并返回列表,若給定sizeint>0,返回總和大約為sizeint
字節的行, 實際讀取值可能比sizhint較大, 因為需要填充緩沖區。
|
|
file.seek(offset[, whence])
|
設置文件當前位置
|
|
file.tell()
|
返回文件當前位置。
|
|
file.truncate([size])
|
截取文件,截取的字節通過size指定,默認為當前文件位置。
|
|
file.write(str)
|
將字符串寫入文件,沒有返回值
|
|
file.writelines(sequence)
|
向文件寫入一個序列字符串列表,如果需要換行則要自己加入每行的換行符。
|
二、文件的操作
2.1?讀取文件
2.1.1?read
1
#
路徑有兩種:
2
#
1.相對路徑,相對于當前程序所在的文件夾
3
#
../ 返回上一層目錄
4
#
相對的是當前程序所在的文件夾
5
#
2.絕對路徑
6
#
* 從磁盤根目錄尋找
7
#
* 互聯網上的絕對路徑
8
9
f = open(
"
a.txt
"
, mode=
"
r
"
, encoding=
"
utf-8
"
)
10
11
#
read函數的參數是讀取多少個字節,如果不加參數,默認是一次性讀取文件的所有內容
12
data =
f.read()
13
#
打印讀取的文件內容
14
print
(data)
15
16
#
關閉文件
17
f.close()
2.1.2?readlines
就像read沒有參數時一樣,readlines可以按照行的方式把整個文件中的內容進行一次性讀取,并且返回的是一個列表,其中每一行的數據為一個元素。
f = open(
"
a.txt
"
, mode=
"
r
"
, encoding=
"
utf-8
"
)
data =
f.readlines()
#
打印讀取的文件內容
print
(type(data))
#
#
關閉文件
f.close()
2.1.3 readline?
讀取一行數據
f = open(
"
a.txt
"
, mode=
"
r
"
, encoding=
"
utf-8
"
)
#
只讀取一行數據
data =
f.readline()
#
打印讀取的文件內容
print
(data)
#
關閉文件
f.close()
2.1.4?讀取大文件
f = open(
"
a.txt
"
, mode=
"
r
"
, encoding=
"
utf-8
"
)
#
讀取大文件的方法
for
line
in
f:
print
(line)
#
關閉文件
f.close()
對可迭代對象 f,進行迭代遍歷:
for line in f
,會自動地使用緩沖IO(buffered IO)以及內存管理,而不必擔心任何大文件的問題。
?2.2?寫文件
1
#
w 模式寫文件會將源文件覆蓋
2
f = open(
"
a.txt
"
, mode=
"
w
"
, encoding=
"
utf-8
"
)
3
4
f.write(
"
aaa
"
)
5
#
關閉
6
f.close()
1
#
追加
2
f = open(
"
a.txt
"
, mode=
"
a
"
, encoding=
"
utf-8
"
)
3
f.write(
"
ddd
"
)
4
f.flush()
5
f.close()
1
#
r+ 默認模式指針在文件的開頭
2
#
f = open("老師點名", mode="r+", encoding="utf-8")
3
#
s = f.read()
4
#
print(s)
5
#
f.write("周杰倫")
6
#
f.close()
7
#
神坑
8
f = open(
"
精品
"
, mode=
"
r+
"
, encoding=
"
utf-8
"
)
9
s = f.read(3)
#
讀3個字符
10
#
不管你前面讀了幾個,后面去寫都是在末尾
11
f.write(
"
aabbcc
"
)
#
沒有任何操作之前進行寫,在開頭寫,如果讀取了一些內容后再寫,則是在最后
12
f.flush()
13
f.close()
文件內的光標移動
1
一: read(3
):
2
1
. 文件打開方式為文本模式時,代表讀取3個字符
3
2
. 文件打開方式為b模式時,代表讀取3個字節
4
二: 其余的文件內光標移動都是以字節為單位如seek,tell,truncate
5
seek(offset[, whence])
6
offset --
開始的偏移量,也就是代表需要移動偏移的字節數,如果是負數表示從倒數第幾位開始
7
whence:可選,默認值為 0。給 offset 定義一個參數,表示要從哪個位置開始偏移;0 代表從文件開頭開始算起,1 代表從當前位置開始算起,2
代表從文件末尾算起。
8
9
10
注意:
11
1. seek有三種移動方式0,1,2
,其中1和2必須在b模式下進行,但無論哪種模式,都是以bytes為單位移動的
12
2. truncate是截斷文件,所以文件的打開方式必須可寫,但是不能用w或w+等方式打開,因為那樣直接清空文件了,所以truncate要在r+或a或a+
等模式下測試效果
13
?
1
#
!/usr/bin/python3
2
3
#
打開文件
4
fo = open(
"
runoob.txt
"
,
"
r+
"
)
5
print
(
"
文件名為:
"
, fo.name)
6
7
line =
fo.readline()
8
print
(
"
讀取的數據為: %s
"
%
(line))
9
10
#
重新設置文件讀取指針到開頭
11
fo.seek(0, 0)
12
line =
fo.readline()
13
print
(
"
讀取的數據為: %s
"
%
(line))
14
15
16
#
關閉文件
17
fo.close()
2.3?with操作
1
為了避免打開文件后忘記關閉,可以通過管理上下文,即:
2
with open(
'
log
'
,
'
r
'
) as f:
3
如此方式,當with代碼塊執行完畢時,內部會自動關閉并釋放文件資源。
4
5
在Python 2.7
后,with又支持同時對多個文件的上下文進行管理即:
6
with open(
'
log1
'
) as obj1, open(
'
log2
'
) as obj2:
1
with open(
"
a.txt
"
, mode=
"
r
"
, encoding=
"
utf-8
"
) as f:
2
data =
f.read()
3
print
(data)
#
提示輸入文件
oldFileName = input(
"
請輸入要拷貝的文件名字:
"
)
#
以讀的方式打開文件
oldFile = open(oldFileName,
'
rb
'
)
#
提取文件的后綴
fileFlagNum = oldFileName.rfind(
'
.
'
)
if
fileFlagNum >
0:
fileFlag
=
oldFileName[fileFlagNum:]
#
組織新的文件名字
newFileName = oldFileName[:fileFlagNum] +
'
[復件]
'
+
fileFlag
#
創建新文件
newFile = open(newFileName,
'
wb
'
)
#
把舊文件中的數據,一行一行的進行復制到新文件中
for
lineContent
in
oldFile.readlines():
newFile.write(lineContent)
#
關閉文件
oldFile.close()
newFile.close()
2.4?文件的相關操作
1
import
os
2
3
#
文件重命名
4
os.rename(
"
畢業論文.txt
"
,
"
畢業論文-最終版.txt
"
)
5
6
#
刪除文件
7
os.remove(
"
畢業論文.txt
"
)
8
9
#
創建文件夾
10
os.mkdir(
"
abc
"
)
11
12
#
獲取當前目錄
13
os.getcwd()
14
15
#
改變默認目錄
16
os.chdir(
"
../
"
)
17
18
#
獲取目錄列表
19
os.listdir(
"
./
"
)
20
21
#
刪除文件夾
22
os.rmdir(
"
abc
"
)
#
創建新文件,把修改后的文件寫入新文件,刪除老文件,再重命名新文件
import
os
with open(
"
吃的
"
, mode=
"
r
"
, encoding=
"
utf-8
"
) as f1, \
open(
"
吃的_副本
"
, mode=
"
w
"
, encoding=
"
utf-8
"
) as f2:
for
line
in
f1:
new_line
= line.replace(
"
肉
"
,
"
菜
"
)
f2.write(new_line)
os.remove(
"
吃的
"
)
#
刪除文件
os.rename(
"
吃的_副本
"
,
"
吃的
"
)
#
重命名文件
#
coding=utf-8
#
批量在文件名前加前綴
import
os
funFlag
= 1
#
1表示添加標志 2表示刪除標志
folderName =
'
./renameDir/
'
#
獲取指定路徑的所有文件名字
dirList =
os.listdir(folderName)
#
遍歷輸出所有文件名字
for
name
in
dirList:
print
name
if
funFlag == 1
:
newName
=
'
[東哥出品]-
'
+
name
elif
funFlag == 2
:
num
= len(
'
[東哥出品]-
'
)
newName
=
name[num:]
print
newName
os.rename(folderName
+name, folderName+newName)
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

