文章目錄
- python文件處理
- 文件的讀取和關(guān)閉
- 文件的打開(kāi)
- 文件的讀取
- 文件的寫(xiě)入
- 文件的關(guān)閉
- 文件的模式
- 文件的讀取位置
- 從頭讀取3個(gè)字符
- 從尾部讀取3個(gè)字符
- 實(shí)戰(zhàn)1
- 實(shí)戰(zhàn)2
python文件處理
python對(duì)文件處理分為兩種,一種是本地處理,而另外一種就是通過(guò)網(wǎng)絡(luò)數(shù)據(jù)處理(也就是爬蟲(chóng)相關(guān)),而本地的數(shù)據(jù)處理,主要是通過(guò)文件的都和寫(xiě)完成
我們先想一想平時(shí)對(duì)文件處理一般遇到過(guò)哪些問(wèn)題:
- 如何讀取一個(gè)文件的內(nèi)容,然后處理,最后寫(xiě)到一個(gè)新的文件
- 如何更改一個(gè)文件夾下面的某一些文件名
python的文件處理簡(jiǎn)單來(lái)說(shuō)分為以下幾點(diǎn):
- 文件的讀寫(xiě)和關(guān)閉
- 文件的模式
- 文件的讀取位置
文件的讀取和關(guān)閉
python中想要獲取文件里的內(nèi)容,先要打開(kāi)文件,然后才能都和寫(xiě),而且寫(xiě)完之后一定要記得關(guān)閉
python中對(duì)文件的打開(kāi)是通過(guò)open函數(shù)來(lái)獲取一個(gè)句柄
-
獲取
讀
的句柄,可以用f.read()
進(jìn)行讀入 -
獲取
寫(xiě)
的句柄f
之后,就可以f.weite()
進(jìn)行寫(xiě)入 - 當(dāng)你文件處理完畢之后,要關(guān)閉文件
應(yīng)該會(huì)有人和博主思考的問(wèn)題一樣:為什么要關(guān)閉文件?
因?yàn)槿绻徽jP(guān)閉文件,緩沖在內(nèi)存中的數(shù)據(jù)就不能真正地寫(xiě)入到文件中,可能造成數(shù)據(jù)丟失的現(xiàn)象
文件的打開(kāi)
file_obj
=
open
(
filename
,
mode
=
'r'
,
buffering
=
-
1
)
# 這里一共有3個(gè)參數(shù),第一個(gè)是強(qiáng)制參數(shù),后面兩個(gè)是可選的
# mode可以是讀,也可以是寫(xiě),或者是追加,一般默認(rèn)的是讀文件
# buffering主要是設(shè)置緩沖區(qū),一般我們都是用-1表示系統(tǒng)默認(rèn)的緩沖區(qū),若寫(xiě)100,則表示緩沖區(qū)為100
文件的讀取
f
=
open
(
r
'somefile.txt'
)
f
.
readline
(
)
# 表示讀文件的一行
f
.
readlines
(
)
# 表示把文件從頭到位都讀出來(lái),并保存為一個(gè)列表
例如我們現(xiàn)在在D盤(pán)的python目錄里面新建
123321.txt
123321.py
打開(kāi)123321.txt輸入:
123456789 ABCDEFGHI IHGFEDCBA
打開(kāi)123321.py,寫(xiě)入代碼如下:
f
=
open
(
r
'123321.txt'
)
print
(
f
.
readline
(
)
)
print
(
f
.
readlines
(
)
)
運(yùn)行結(jié)果如下:
123456789
[
'ABCDEFGHI\n'
,
'IHGFEDCBA'
]
文件的寫(xiě)入
f
=
open
(
r
'somefile.txt,'
w'
)
f
.
write
(
)
# 表示把字符串寫(xiě)入
f
.
writelines
(
)
# 表示把一個(gè)列表寫(xiě)入
f
.
close
(
)
# 表示關(guān)閉文件
例如我們現(xiàn)在在D盤(pán)的python目錄里面新建
ABCCBA.txt
ABCCBA.py
打開(kāi)ABCCBA.py,寫(xiě)入代碼如下:
f
=
open
(
r
'ABCCBA.txt'
,
'w'
)
f
.
write
(
'123321'
)
f
.
writelines
(
[
'\nABCDEFGHI\n'
,
'IHGFEDCBA'
]
)
f
.
close
(
)
此處在后面如果沒(méi)寫(xiě)入
f.close()
,那么在最后你打開(kāi)ABCCBA.txt文件后是看不到你寫(xiě)入的內(nèi)容的
運(yùn)行結(jié)果:
打開(kāi)D盤(pán)的python目錄下的ABCCBA.txt文件
123321
ABCDEFGHI
IHGFEDCBA
文件的關(guān)閉
此處我介紹兩種關(guān)閉方法
1)
f
=
open
(
r
'somefile.txt'
)
.
.
.
.
.
.
.
.
.
.
.
.
.
f
.
close
(
)
2)
with
open
(
r
'somefile.txt'
)
as
f
:
f
.
readlines
(
)
with用法是python極力推薦的一種使用方法,因?yàn)樗軌蜃詣?dòng)幫你關(guān)掉文件,你只需要專(zhuān)注對(duì)文件的處理就可以了
文件的模式
在上面我僅僅只列舉了python的讀和寫(xiě),那么其他的模式該怎么辦呢?
其實(shí)python只需要改變一下open里面的模式參數(shù)就可以了
? open函數(shù)中的模式參數(shù)
值 | 描述 |
---|---|
‘r’ | 讀模式 |
‘w’ | 寫(xiě)模式 |
‘a(chǎn)’ | 追加模式 |
‘b’ | 二進(jìn)制模式 |
‘+’ | 讀/寫(xiě)模式 |
‘r+’ | 以讀寫(xiě)模式打開(kāi) |
‘w+’ | 以讀寫(xiě)模式打開(kāi) |
‘a(chǎn)+’ | 以讀寫(xiě)模式打開(kāi) |
‘rb’ | 以二進(jìn)制讀模式打開(kāi) |
文件的讀取位置
有時(shí)候我們就只想讀取文件中的某一部分,或者我們需要從文章的某一部分開(kāi)始讀取
那么這就要用到
seek()
函數(shù)
file_obj
.
seek
(
offset
,
whence
=
0
)
# seek 主要是在文件中移動(dòng)指針,從`whence`(0表示文件的開(kāi)頭,1表示當(dāng)前位置,2表示文件的末尾)偏移offset個(gè)字符
例如在D盤(pán)python目錄下的123321.txt文件
123456789 ABCDEFGHI IHGFEDCBA
從頭讀取3個(gè)字符
在當(dāng)前目錄下創(chuàng)建seek1.py文件,寫(xiě)入代碼如下:
f
=
open
(
r
'123321.txt'
)
f
.
seek
(
0
,
0
)
print
(
f
.
read
(
3
)
)
f
.
close
(
)
運(yùn)行結(jié)果:
123
從尾部讀取3個(gè)字符
在當(dāng)前目錄下創(chuàng)建seek2.py文件,寫(xiě)入代碼如下:
f
=
open
(
b
'123321.txt'
)
f
.
seek
(
-
3
,
2
)
print
(
f
.
read
(
3
)
)
f
.
close
(
)
運(yùn)行結(jié)果:
實(shí)戰(zhàn)1
在D盤(pán)python目錄里面創(chuàng)建2019.txt文件,寫(xiě)入:
hahaha hary natasha mary
請(qǐng)把2019.txt文件里面的內(nèi)容都出來(lái),寫(xiě)到一個(gè)新的文件,文件名:9102.txt,格式按照下面這種:
1 : hahaha 2 : hary 3 : natasha 4 : mary
在當(dāng)前目錄下創(chuàng)建test.py,代碼如下:
f
=
open
(
'2019.txt'
)
# 打開(kāi)文件
count
=
f
.
readlines
(
)
# 從文件中把內(nèi)容都讀出來(lái),保存到列表中
for
i
in
range
(
0
,
len
(
count
)
)
:
# 關(guān)閉文件
count
[
i
]
=
str
(
i
+
1
)
+
':'
+
count
[
i
]
# 遍歷列表,將每一行都加上下標(biāo)
print
(
count
)
f
.
close
(
)
# 關(guān)閉文件
f
=
open
(
'9102.txt'
,
'w'
)
# 打開(kāi)文件
f
.
writelines
(
count
)
# 把新的內(nèi)容寫(xiě)入文件
f
.
close
(
)
優(yōu)化重構(gòu)代碼:
def
read_File
(
)
:
# 把讀文件抽成一個(gè)函數(shù)
with
open
(
r
'2019.txt'
,
'r'
)
as
f
:
read_lines_from_file
=
f
.
readlines
(
)
return
read_lines_from_file
def
write_File
(
count
=
[
]
)
:
# 把寫(xiě)文件抽成一個(gè)函數(shù)
with
open
(
r
'9102.txt'
,
'w'
)
as
f
:
f
.
writelines
(
count
)
new_lines
=
[
]
# 遍歷列表,將每一行都加上下標(biāo)
for
index
,
line
in
enumerate
(
read_File
(
)
)
:
new_lines
.
append
(
str
(
index
+
1
)
+
':'
+
line
)
write_File
(
new_lines
)
運(yùn)行結(jié)果:
['1:hahaha\n', '2:hary\n', '3:natasha\n', '4:mary']
打開(kāi)9102.txt文件
1
:hahaha
2
:hary
3
:natasha
4
:mary
實(shí)戰(zhàn)2
在D盤(pán)python目錄下創(chuàng)建hahaha文件夾,網(wǎng)上下載幾張圖片放進(jìn)去,用代碼將全部照片重命名為1.jpg,2.jpg,3.jpg,…以此類(lèi)推
在D盤(pán)python目錄下創(chuàng)建test2.py,代碼如下:
import
os
import
re
import
sys
def
renameall
(
)
:
fileList
=
os
.
listdir
(
r
"D:\python\hahaha"
)
#待修改文件夾
print
(
"修改前:"
+
str
(
fileList
)
)
#輸出文件夾中包含的文件
currentpath
=
os
.
getcwd
(
)
#得到進(jìn)程當(dāng)前工作目錄
os
.
chdir
(
r
"D:\python\hahaha"
)
#將當(dāng)前工作目錄修改為待修改文件夾的位置
num
=
1
#名稱(chēng)變量
for
fileName
in
fileList
:
#遍歷文件夾中所有文件
pat
=
".+\.(jpg|png|gif)"
#匹配文件名正則表達(dá)式
pattern
=
re
.
findall
(
pat
,
fileName
)
#進(jìn)行匹配
os
.
rename
(
fileName
,
(
str
(
num
)
+
'.'
+
pattern
[
0
]
)
)
#文件重新命名
num
=
num
+
1
#改變編號(hào),繼續(xù)下一項(xiàng)
print
(
"---------------------------------------------------"
)
os
.
chdir
(
currentpath
)
#改回程序運(yùn)行前的工作目錄
sys
.
stdin
.
flush
(
)
#刷新
print
(
"修改后:"
+
str
(
os
.
listdir
(
r
"D:\python\hahaha"
)
)
)
#輸出修改后文件夾中包含的文件
renameall
(
)
運(yùn)行結(jié)果:
修改前:
[
'ACG.GY_01.jpg'
,
'ACG.GY_02.jpg'
,
'ACG.GY_03.jpg'
,
'ACG.GY_04.jpg'
,
'ACG.GY_05.jpg'
,
'ACG.GY_06.jpg'
,
'ACG.GY_07.jpg'
,
'ACG.GY_08.jpg'
,
'ACG.GY_09.jpg'
,
'ACG.GY_10.jpg'
,
'ACG.GY_11.jpg'
,
'ACG.GY_12.jpg'
,
'ACG.GY_13.jpg'
,
'ACG.GY_14.jpg'
,
'ACG.GY_15.jpg'
,
'ACG.GY_16.jpg'
,
'ACG.GY_17.jpg'
,
'ACG.GY_18.jpg'
,
'ACG.GY_19.jpg'
,
'ACG.GY_20.jpg'
,
'ACG.GY_21.jpg'
,
'ACG.GY_22.jpg'
,
'ACG.GY_23.jpg'
,
'ACG.GY_24.jpg'
]
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
修改后:
[
'1.jpg'
,
'2.jpg'
,
'3.jpg'
,
'4.jpg'
,
'5.jpg'
,
'6.jpg'
,
'7.jpg'
,
'8.jpg'
,
'9.jpg'
,
'10.jpg'
,
'11.jpg'
,
'12.jpg'
,
'13.jpg'
,
'14.jpg'
,
'15.jpg'
,
'16.jpg'
,
'17.jpg'
,
'18.jpg'
,
'19.jpg'
,
'20.jpg'
,
'21.jpg'
,
'22.jpg'
,
'23.jpg'
,
'24.jpg'
]
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
