文章目录
- python文件处理
- 文件的读取和关闭
- 文件的打开
- 文件的读取
- 文件的写入
- 文件的关闭
- 文件的模式
- 文件的读取位置
- 从头读取3个字符
- 从尾部读取3个字符
- 实战1
- 实战2
python文件处理
python对文件处理分为两种,一种是本地处理,而另外一种就是通过网络数据处理(也就是爬虫相关),而本地的数据处理,主要是通过文件的都和写完成
我们先想一想平时对文件处理一般遇到过哪些问题:
- 如何读取一个文件的内容,然后处理,最后写到一个新的文件
- 如何更改一个文件夹下面的某一些文件名
python的文件处理简单来说分为以下几点:
- 文件的读写和关闭
- 文件的模式
- 文件的读取位置
文件的读取和关闭
python中想要获取文件里的内容,先要打开文件,然后才能都和写,而且写完之后一定要记得关闭
python中对文件的打开是通过open函数来获取一个句柄
-
获取
读
的句柄,可以用f.read()
进行读入 -
获取
写
的句柄f
之后,就可以f.weite()
进行写入 - 当你文件处理完毕之后,要关闭文件
应该会有人和博主思考的问题一样:为什么要关闭文件?
因为如果不正常关闭文件,缓冲在内存中的数据就不能真正地写入到文件中,可能造成数据丢失的现象
文件的打开
file_obj
=
open
(
filename
,
mode
=
'r'
,
buffering
=
-
1
)
# 这里一共有3个参数,第一个是强制参数,后面两个是可选的
# mode可以是读,也可以是写,或者是追加,一般默认的是读文件
# buffering主要是设置缓冲区,一般我们都是用-1表示系统默认的缓冲区,若写100,则表示缓冲区为100
文件的读取
f
=
open
(
r
'somefile.txt'
)
f
.
readline
(
)
# 表示读文件的一行
f
.
readlines
(
)
# 表示把文件从头到位都读出来,并保存为一个列表
例如我们现在在D盘的python目录里面新建
123321.txt
123321.py
打开123321.txt输入:
123456789 ABCDEFGHI IHGFEDCBA
打开123321.py,写入代码如下:
f
=
open
(
r
'123321.txt'
)
print
(
f
.
readline
(
)
)
print
(
f
.
readlines
(
)
)
运行结果如下:
123456789
[
'ABCDEFGHI\n'
,
'IHGFEDCBA'
]
文件的写入
f
=
open
(
r
'somefile.txt,'
w'
)
f
.
write
(
)
# 表示把字符串写入
f
.
writelines
(
)
# 表示把一个列表写入
f
.
close
(
)
# 表示关闭文件
例如我们现在在D盘的python目录里面新建
ABCCBA.txt
ABCCBA.py
打开ABCCBA.py,写入代码如下:
f
=
open
(
r
'ABCCBA.txt'
,
'w'
)
f
.
write
(
'123321'
)
f
.
writelines
(
[
'\nABCDEFGHI\n'
,
'IHGFEDCBA'
]
)
f
.
close
(
)
此处在后面如果没写入
f.close()
,那么在最后你打开ABCCBA.txt文件后是看不到你写入的内容的
运行结果:
打开D盘的python目录下的ABCCBA.txt文件
123321
ABCDEFGHI
IHGFEDCBA
文件的关闭
此处我介绍两种关闭方法
1)
f
=
open
(
r
'somefile.txt'
)
.
.
.
.
.
.
.
.
.
.
.
.
.
f
.
close
(
)
2)
with
open
(
r
'somefile.txt'
)
as
f
:
f
.
readlines
(
)
with用法是python极力推荐的一种使用方法,因为它能够自动帮你关掉文件,你只需要专注对文件的处理就可以了
文件的模式
在上面我仅仅只列举了python的读和写,那么其他的模式该怎么办呢?
其实python只需要改变一下open里面的模式参数就可以了
open函数中的模式参数
值 | 描述 |
---|---|
‘r’ | 读模式 |
‘w’ | 写模式 |
‘a’ | 追加模式 |
‘b’ | 二进制模式 |
‘+’ | 读/写模式 |
‘r+’ | 以读写模式打开 |
‘w+’ | 以读写模式打开 |
‘a+’ | 以读写模式打开 |
‘rb’ | 以二进制读模式打开 |
文件的读取位置
有时候我们就只想读取文件中的某一部分,或者我们需要从文章的某一部分开始读取
那么这就要用到
seek()
函数
file_obj
.
seek
(
offset
,
whence
=
0
)
# seek 主要是在文件中移动指针,从`whence`(0表示文件的开头,1表示当前位置,2表示文件的末尾)偏移offset个字符
例如在D盘python目录下的123321.txt文件
123456789 ABCDEFGHI IHGFEDCBA
从头读取3个字符
在当前目录下创建seek1.py文件,写入代码如下:
f
=
open
(
r
'123321.txt'
)
f
.
seek
(
0
,
0
)
print
(
f
.
read
(
3
)
)
f
.
close
(
)
运行结果:
123
从尾部读取3个字符
在当前目录下创建seek2.py文件,写入代码如下:
f
=
open
(
b
'123321.txt'
)
f
.
seek
(
-
3
,
2
)
print
(
f
.
read
(
3
)
)
f
.
close
(
)
运行结果:
实战1
在D盘python目录里面创建2019.txt文件,写入:
hahaha hary natasha mary
请把2019.txt文件里面的内容都出来,写到一个新的文件,文件名:9102.txt,格式按照下面这种:
1 : hahaha 2 : hary 3 : natasha 4 : mary
在当前目录下创建test.py,代码如下:
f
=
open
(
'2019.txt'
)
# 打开文件
count
=
f
.
readlines
(
)
# 从文件中把内容都读出来,保存到列表中
for
i
in
range
(
0
,
len
(
count
)
)
:
# 关闭文件
count
[
i
]
=
str
(
i
+
1
)
+
':'
+
count
[
i
]
# 遍历列表,将每一行都加上下标
print
(
count
)
f
.
close
(
)
# 关闭文件
f
=
open
(
'9102.txt'
,
'w'
)
# 打开文件
f
.
writelines
(
count
)
# 把新的内容写入文件
f
.
close
(
)
优化重构代码:
def
read_File
(
)
:
# 把读文件抽成一个函数
with
open
(
r
'2019.txt'
,
'r'
)
as
f
:
read_lines_from_file
=
f
.
readlines
(
)
return
read_lines_from_file
def
write_File
(
count
=
[
]
)
:
# 把写文件抽成一个函数
with
open
(
r
'9102.txt'
,
'w'
)
as
f
:
f
.
writelines
(
count
)
new_lines
=
[
]
# 遍历列表,将每一行都加上下标
for
index
,
line
in
enumerate
(
read_File
(
)
)
:
new_lines
.
append
(
str
(
index
+
1
)
+
':'
+
line
)
write_File
(
new_lines
)
运行结果:
['1:hahaha\n', '2:hary\n', '3:natasha\n', '4:mary']
打开9102.txt文件
1
:hahaha
2
:hary
3
:natasha
4
:mary
实战2
在D盘python目录下创建hahaha文件夹,网上下载几张图片放进去,用代码将全部照片重命名为1.jpg,2.jpg,3.jpg,…以此类推
在D盘python目录下创建test2.py,代码如下:
import
os
import
re
import
sys
def
renameall
(
)
:
fileList
=
os
.
listdir
(
r
"D:\python\hahaha"
)
#待修改文件夹
print
(
"修改前:"
+
str
(
fileList
)
)
#输出文件夹中包含的文件
currentpath
=
os
.
getcwd
(
)
#得到进程当前工作目录
os
.
chdir
(
r
"D:\python\hahaha"
)
#将当前工作目录修改为待修改文件夹的位置
num
=
1
#名称变量
for
fileName
in
fileList
:
#遍历文件夹中所有文件
pat
=
".+\.(jpg|png|gif)"
#匹配文件名正则表达式
pattern
=
re
.
findall
(
pat
,
fileName
)
#进行匹配
os
.
rename
(
fileName
,
(
str
(
num
)
+
'.'
+
pattern
[
0
]
)
)
#文件重新命名
num
=
num
+
1
#改变编号,继续下一项
print
(
"---------------------------------------------------"
)
os
.
chdir
(
currentpath
)
#改回程序运行前的工作目录
sys
.
stdin
.
flush
(
)
#刷新
print
(
"修改后:"
+
str
(
os
.
listdir
(
r
"D:\python\hahaha"
)
)
)
#输出修改后文件夹中包含的文件
renameall
(
)
运行结果:
修改前:
[
'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'
]