python文件处理

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

[TOC]

python文件处理

python对文件处理分为两种,一种是本地处理,而另外一种就是通过网络数据处理(也就是爬虫相关),而本地的数据处理,主要是通过文件的都和写完成

我们先想一想平时对文件处理一般遇到过哪些问题:

  • 如何读取一个文件的内容,然后处理,最后写到一个新的文件
  • 如何更改一个文件夹下面的某一些文件名

python的文件处理简单来说分为以下几点:

  • 文件的读写和关闭
  • 文件的模式
  • 文件的读取位置

文件的读取和关闭

python中想要获取文件里的内容,先要打开文件,然后才能都和写,而且写完之后一定要记得关闭

python中对文件的打开是通过open函数来获取一个句柄

  • 获取的句柄,可以用f.read()进行读入
  • 获取的句柄f之后,就可以f.weite()进行写入
  • 当你文件处理完毕之后,要关闭文件

应该会有人和博主思考的问题一样:为什么要关闭文件?

因为如果不正常关闭文件,缓冲在内存中的数据就不能真正地写入到文件中,可能造成数据丢失的现象

文件的打开

1
2
3
4
file_obj=open(filename,mode='r',buffering=-1)
# 这里一共有3个参数,第一个是强制参数,后面两个是可选的
# mode可以是读,也可以是写,或者是追加,一般默认的是读文件
# buffering主要是设置缓冲区,一般我们都是用-1表示系统默认的缓冲区,若写100,则表示缓冲区为100

文件的读取

1
2
3
f=open(r'somefile.txt')
f.readline() # 表示读文件的一行
f.readlines() # 表示把文件从头到位都读出来,并保存为一个列表

例如我们现在在D盘的python目录里面新建

123321.txt

123321.py

打开123321.txt输入:

1
2
3
4
> 123456789
> ABCDEFGHI
> IHGFEDCBA
>

打开123321.py,写入代码如下:

1
2
3
f=open(r'123321.txt')
print(f.readline())
print(f.readlines())

运行结果如下:

1
2
3
123456789

['ABCDEFGHI\n', 'IHGFEDCBA']

文件的写入

1
2
3
4
f=open(r'somefile.txt,'w')
f.write() # 表示把字符串写入
f.writelines() # 表示把一个列表写入
f.close() # 表示关闭文件

例如我们现在在D盘的python目录里面新建

ABCCBA.txt

ABCCBA.py

打开ABCCBA.py,写入代码如下:

1
2
3
4
f=open(r'ABCCBA.txt','w')
f.write('123321')
f.writelines(['\nABCDEFGHI\n', 'IHGFEDCBA'])
f.close()

此处在后面如果没写入f.close(),那么在最后你打开ABCCBA.txt文件后是看不到你写入的内容的

运行结果:

打开D盘的python目录下的ABCCBA.txt文件

1
2
3
123321
ABCDEFGHI
IHGFEDCBA

文件的关闭

此处我介绍两种关闭方法

1)

1
2
3
f=open(r'somefile.txt')
.............
f.close()

2)

1
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()函数

1
2
file_obj.seek(offset,whence=0)
# seek 主要是在文件中移动指针,从`whence`(0表示文件的开头,1表示当前位置,2表示文件的末尾)偏移offset个字符

例如在D盘python目录下的123321.txt文件

1
2
3
4
> 123456789
> ABCDEFGHI
> IHGFEDCBA
>

从头读取3个字符

在当前目录下创建seek1.py文件,写入代码如下:

1
2
3
4
f=open(r'123321.txt')
f.seek(0,0)
print(f.read(3))
f.close()

运行结果:

1
123

从尾部读取3个字符

在当前目录下创建seek2.py文件,写入代码如下:

1
2
3
4
f=open(b'123321.txt')
f.seek(-3,2)
print(f.read(3))
f.close()

运行结果:

1
2


实战1

在D盘python目录里面创建2019.txt文件,写入:

1
2
3
4
5
> hahaha
> hary
> natasha
> mary
>

请把2019.txt文件里面的内容都出来,写到一个新的文件,文件名:9102.txt,格式按照下面这种:

1
2
3
4
5
> 1:hahaha
> 2:hary
> 3:natasha
> 4:mary
>

在当前目录下创建test.py,代码如下:

1
2
3
4
5
6
7
8
9
10
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()

优化重构代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
['1:hahaha\n', '2:hary\n', '3:natasha\n', '4:mary']

打开9102.txt文件

1
2
3
4
1:hahaha
2:hary
3:natasha
4:mary

实战2

在D盘python目录下创建hahaha文件夹,网上下载几张图片放进去,用代码将全部照片重命名为1.jpg,2.jpg,3.jpg,…….以此类推

在D盘python目录下创建test2.py,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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()

运行结果:

1
2
3
修改前:['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']
打赏
  • © 2019-2020 Li Jie
  • Powered by Hexo Theme Ayer
    • PV:
    • UV:

喜欢就打赏吧~

支付宝
微信