Python中对文件的操作
python的文件操作
python中文件操作的内置函数只有一个,在之前其实已经看到,现在来看看它的具体用法是怎么样的。
open()
语法:
open(path/files, mode=‘’, encoding=‘’)
文件操作时一般有两种用法
第一种:
open(path/files, mode=‘’, encoding='') #打开文件
# 完成后,要记得关闭,所以后边还要跟随
.close() # 关闭文件
第二种:
whit open(path/files, mode=‘’, encoding='') as 别名:
文件操作
......
#这种方式在whit语句完成后,会自己关闭文件
使用open()函数打开文件,执行语句后,文件内容并没有被读取到内存中,而是处于一种待命状态。
如果把文件看做是一个封闭的空间,比如一间房屋,那么在我们执行open()打开文件后,相当于把这间房间的门打开,让封闭空间开一个口。
具体里边有什么内容,在没有后续操作时,是不知道的。
也可以理解为,通过Open建立了一条通往文件的通道,可以随时通过这条通道去对文件进行读写。
再来看看open()里的几个参数的功能:
-
path/files:文件名。要注意文件的位置,文件路径:
一般使用相对路径:’…‘:表示上一级文件夹,'.'表示当前文件夹。不清楚的可以去看看文件路径的相关知识介绍。相同目录内可省略路径。
-
mode=‘’:表示打开文件的方式文件。
- r:即read,以只读方式打开文件。
- w:即write,以写入的方式打开文件。注意使用w参数,被打开的文件内容会被清除,如果文件不存在,则在所给路径目录内新建文件。
- a:即append,以追加写入的方式打开文件。
-
encoding=’‘:文件的编码类型,一般打开文本文件时用’utf-8‘,其他非文本文件可以省略。
最后,python中对文件的操作流程大概是:
文本文件的操作
读取文件内容
常用的有四个函数,分别是:
- .read():把文件内容全部读取到内存里。大文件不适用。
- .readable():判断是否可读,返回True和False。
- .readline():读取一行文件的内容。
- .readlines():读取全部内容,含隐藏符号‘\n’等,返回的是一个列表。
示例:读取文本文件。
准备文本文件"将进酒.txt",文件内容如下:
君不见,黄河之水天上来,奔流到海不复回。
君不见,高堂明镜悲白发,朝如青丝暮成雪。
人生得意须尽欢,莫使金樽空对月。
天生我材必有用,千金散尽还复来。
烹羊宰牛且为乐,会须一饮三百杯。
岑夫子,丹丘生,将进酒,杯莫停。
与君歌一曲,请君为我倾耳听。
钟鼓馔玉不足贵,但愿长醉不愿醒。
古来圣贤皆寂寞,惟有饮者留其名。
陈王昔时宴平乐,斗酒十千恣欢谑。
主人何为言少钱,径须沽取对君酌。
五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。
.read()的使用:
files = open('将进酒.txt', mode= 'r', encoding= 'utf-8')
# 读取全部文本
print(files.read())
files.close() # 文件操作完,关闭文件。
.readline()的使用
files = open('将进酒.txt', mode= 'r', encoding= 'utf-8')
for i in range(12): # 有12行文字,所以循环打印12,每次读一行。连续打印会连续读行。
line = files.readline().strip()
print(line) # 加.strip()为了去除每行末的\n换行符
files.close()
readline()的括号里是可以带一个整数的,默认为-1,好像是限制每行的字符数量。read()和readlines()也可以在括号里输入一个Int数值。
最常用的for循环读文件的方法
# 效果与上边一致。
files = open('将进酒.txt', mode= 'r', encoding= 'utf-8')
for line in files:
line =line.strip()
print(line)
files.close()
.readlines()的使用
# 读取全部,返回一个列表。可见到隐藏的\n换行符。
files = open('将进酒.txt', mode= 'r', encoding= 'utf-8')
print(files.readlines())
.readable()的使用
# 返回值为:True
files = open('将进酒.txt', mode= 'r', encoding= 'utf-8')
print(files.readable())
files.close()
把数据写到文件里
要把数据写到文件里,在打开文件是open()的mode = ‘w’,常用的就是write(‘写入的数据’)。
write():写入数据
需要注意的是:
- 往文件里写入数据时,需要在打开文件时使用mode = 'w’模式。
- 在mode = 'w’模式下,
- 打开的文件如果不存在,则会创建新文件。
- 如果文件存在,则会把原文件里的内容清空。
示例:把"将进酒.txt"的内容写到”古诗欣赏.txt"里
files1 = open('将进酒.txt', mode= 'r', encoding= 'utf-8') # 这个是读
files2 = open('古诗欣赏.txt', mode= 'w', encoding= 'utf-8') # 这个是写,而且新建文件。
for i in files1:
files2.write(i)
files1.close()
files2.close()
新建一个列表,把列表里的元素写到 ”古诗欣赏.txt“里
files2 = open('古诗欣赏.txt', mode= 'w', encoding= 'utf-8') # 打开已有文件,则清空文件内容
gs_lb = ['将进酒', '静月思', '黄鹤楼送孟浩然', '蜀道难']
for i in gs_lb:
files2.write(i) # 把列表gs_ls里的元素写入打开的文件。
files2.write('\n') # 可以加个换行符换行,不然写入的时候是连续写成一行的。
files2.close()
追加写入数据
打开文件时使用 mode = ‘a’ 模式,这是即可在保留原文件内容的基础上,追加写入新数据。
示例:在上述"古诗欣赏.txt"文件里,在增加几首白居易的诗。
files2 = open('古诗欣赏.txt', mode= 'a', encoding= 'utf-8') # 打开已有文件,则清空文件内容
gs_bjy = ['问刘十九', '长恨歌', '忆江南']
for i in gs_bjy:
files2.write(i) # 同样的write因为打开模式是'a',所以变成追加写入数据
files2.write('\n')
files2.close() # 别忘记最后要关闭文件。
.write相关的也有诸如writeline、writelines等……
用whit open() as… : 语句形式做文件操作
使用的效果与直接用open()差不多,只是最后不需要在使用close()关闭文件。
- whit的句式,会在文件操作完成后自己关闭文件
- whit句式带’:',所以关于文件操作的语句类似for等语法,要注意缩进
- 在whit句式中,如果指令太长,可以使用’\‘符号换行接续
示例:把前文一个示例修改为whit的句式
# 原代码指令如下:
files1 = open('将进酒.txt', mode= 'r', encoding= 'utf-8') # 这个是读
files2 = open('将古诗欣赏.txt', mode= 'w', encoding= 'utf-8') # 这个是写,而且新建文件。
for i in files1:
files2.write(i)
files1.close()
files2.close()
# 修改后的代码如下:
with open('将进酒.txt', mode= 'r', encoding= 'utf-8') as files1, \
open('古诗欣赏.txt', mode= 'w', encoding= 'utf-8') as files2:
for i in files1:
files2.write(i)
非文本文件的操作
非文本文件的操作与文本文件操作类似,不同的地方在于:
- 非文本文件在使用open()打开时,不需要encoding参数
- 非文本文件在打开时打开的是字节数组,所以需要在mode = ‘r’ 或 ‘w’的后边加上小写字母‘b’:
- 读取模式时:mode = ‘rb’
- 写入模式时:mode = ‘wb’
文件的修改
之所以把这个问题列为一个单独的标题,主要是因为Python中是没办法直接对原文件进行修改保存的。
在做 文件的修改操作是,流程大概是这样:
打开原文件后,利用一个文件的副本,进行操作
示例:
# 新建一个"菜名.txt"文件。
cm = ['蒸羊羔', '蒸熊掌', '烧花鸭', '腊肉', '蒸鹿尾儿', '烧雏鸡', '烧子鹅', '卤猪', '卤鸭', '酱鸡']
files = open('菜名.txt', mode= 'w', encoding= 'utf-8') # 这个是写,而且新建文件。
for i in cm:
files.write(i)
files.write('\n')
print(i, ' ', end = '') # 打印看看内容
files.close()
print()
# 把文件里的烧字改成烤字,写入“菜名_副本.txt”:
with open('菜名.txt', mode= 'r', encoding= 'utf-8') as f1, \
open('菜名_副本.txt', mode= 'w', encoding= 'utf-8') as f2:
for line in f1:
line = line.strip()
if line.startswith("烧"): # 查找符合条件的菜名
line = line.replace('烧', "烤") # 修改菜名
f2.write(line) # 修改后的菜名写入副本
f2.write('\n')
print(line, ' ', end = '') # 打印看看内容
# 加载os模块,删除“菜名.txt”,修改“菜名_副本.txt”为“菜名.txt”。
import os
os.remove('菜名.txt')
os.rename('菜名_副本.txt', "菜名.txt")
运行结果:
蒸羊羔 蒸熊掌 烧花鸭 腊肉 蒸鹿尾儿 烧雏鸡 烧子鹅 卤猪 卤鸭 酱鸡
蒸羊羔 蒸熊掌 烤花鸭 腊肉 蒸鹿尾儿 烤雏鸡 烤子鹅 卤猪 卤鸭 酱鸡
操作后,只剩下修改后的“菜名.txt”文件存在。
写在最后
通过上述内容,不难发现python中关于文件操作的内置函数只有Open一个,学习之后大概对Python中文件处理的流程和方式就会有一个清楚的认知。
如果要使用Python对文件更方便的操作,我们需要用到python的模块,其中有python的内置模块,也有第三方提供的模块,例如:os、shutil、openpyxl、docx等。
调用模块操作文件时,文件的路径和文件名都是以字符串的形式使用的。
而且如果你要把某个路径赋值给一个变量,我看到有些代码里会在字符串前加上一个小写的r
例如:
path = r"d:\python\"
第三方模块的几个命令:
pip list # 列出已有模块
pip show 模块名称 # 查看某个模块
pip install 模块名称 #下载安装模块
如果要对文件夹操作的话,也只能通过调用相关模块。