XX学Python·文件
文件基本操作
- 文件打开的格式:
- file1 = open(文件路径,读写模式),使用open函数。会返回一个文件对象。
- 文件路径:可以写相对路径,也可以写绝对路径。路径需要以字符串形式传入。
- 读写模式:r(读取) w(写入) a(追加)
- open默认打开模式是r 模式,多用于打开文本类型的文件
- file1 = open(文件路径,读写模式),使用open函数。会返回一个文件对象。
- 文件打开后,必须关闭,否则持续消耗服务器性能。
# 格式: open(file_name(文件路径), mode(读写模式)) 使用该函数会返回一个文件对象
file1 = open('python.txt', 'r', encoding='utf-8')
print(file1) # <_io.TextIOWrapper name='python.txt' mode='r' encoding='utf-8'>
print(type(file1)) # <class '_io.TextIOWrapper'>
print(file1.read()) # 我会长成一棵大树,等你赞一声良木
# 若报错UnicodeDecodeError,打开文件编码方式encoding='utf-8'或encoding='utf-8-sig'
file1.close() # 关闭文件后,即文件的连接状态消失了,但文件对象没发生改变
print(file1) # 所以这句任然能执行,结果和前面同,但file对象不能进行任何读写操作,因已无法连接文件
print(file1.read()) # ValueError: I/O operation on closed file.已经关闭的文件
文件的读取
- read()格式:文件对象.read(num)
- num表示要从文件中读取的数据长度(单位:字符),若没有传入num,就表示读取文件中所有数据。
- 最大读取字符一般限定为1024*1024(约1兆,若utf-8读取汉字就是约3兆)
- 如果读取的文件不存在则直接报错
file1 = open('python.txt', 'r', encoding='utf-8')
# 文件每一次读取,都会持续向后读取,直到文件关闭或程序结束,所以可以使用循环进行读取
# 在所有文件内容读取完成后,会持续返回空字符串("")
while True:
content = file1.read(4)
if content == '':
break
print(content)
file1.close()
'''
我会长成
一棵大树
等你赞
一声良木
'''
- readline: 每次读取一行,以\n为分隔符,在一个文件开启后,多次执行读取操作会持续向后读取,如果字符全部被读取完成,则返回空字符串。
- readlines:一次性将文件全部读取,读取后,将文字以一行为一个元素保存到列表当中进行返回。
file1 = open('python.txt', 'r', encoding='utf-8')
while True:
content = file1.readline()
if content == '':
break
print(content, end='')
file1.close()
'''
我会长成一棵大树
等你赞一声良木
风轻云淡
坐看云卷云舒
'''
file1 = open('python.txt', 'r', encoding='utf-8')
content = file1.readlines()
print(content)
# ['我会长成一棵大树\n', '等你赞一声良木\n', '风轻云淡\n', '坐看云卷云舒']
file1.close()
文件的写入
- 使用写入模式‘w’打开文件
- 如果文件存在,则清空源数据
- 如果文件不存在,则新建文件,不会报错
- 使用write可以写入字符
- 在windows电脑中书写文件读写时,需要使用encoding进行编码格式指定
- 格式:open(文件路径, 读写模式, encoding = 编码格式)
file1 = open('test.txt', 'w')
file1.close() # 文件不存在,新建了一个文件test.txt,没有报错
# 如果被打开的文件存在,则会将源文件内的字符清空
# 如果使用windows电脑进行开发,在写入文件时,需要制定编码格式为'utf-8'
# 如果使用linux或者mac默认是utf-8编码,不需要转码
file2 = open('python.txt', 'w', encoding='utf-8')
# file2.write('我爱中国')
# 如果写入的字符串是三对引号包过内部的换行符会不会写入呢? 会写入格式
file2.write('''
我爱北京天安门,
天安门上太阳升。''')
file2.close()
# writelines是配合readlines进行使用的,可将由字符串元素组成的列表一次性写入文件
file3 = open('test.txt', 'w', encoding='utf-8')
lines = ['吴丝蜀桐张高秋\n', '空山凝云颓不流\n', '举头望明月\n', '低头思故乡\n']
file3.writelines(lines)
file3.close()
# 文件读写都有一个游标来操作。因为第二次写后游标在最后,后面没有内容,所以返回空字符串
f = open("1.txt",'w+')
f.write("hello ")
f.write("China!")
d = f.read()
print(d) # 结果打印空字符串
f.close()
文件的追加
- ‘a’:模式下进行文件打开
- 如果文件不存在,则创建新文件
- 如果文件存在,则在原有文件内进行字符串追加,不会清空源文件
- 在追加模式下,也使用write进行文件写入,没有单独追加方法,写入方式和‘w’模式一致
file = open('bigdata.txt', 'a', encoding='utf-8')
# 进行追加操作(注意:没有append方法,追加操作也是使用write进行写入,只是不会清空源文件)
file.write('乱我心者今日之日多烦忧')
# 关闭文件
file.close()
文件读写模式拓展(能明白意思即可)
-
a: a a+ ab ab+
- a:字符追加模式
- a+ :字符追加模式下可以进行字符读取
- ab:字节追加
- ab+:字节追加模式下,可以进行字节读取
-
w: w w+ wb wb+
- w:字符写入模式
- w+:字符写入模式下可以进行字符读取
- wb:字节写入模式
- wb+:字节写入模式下,可以进行字节读取
-
r: r r+ rb rb+
- r:字符读取模式,文件的指针将会放在文件的开头。这是默认模式。
- r+:字符读取模式下可以进行字符写入
- rb:字节读取模式,比如读取图片
- rb+:字节读取模式下,可以进行字节写入
文件备份案例
# 1.获取用户键入的文件名
file_name = input('请输入您要备份的文件名称:')
old_file = open(file_name, 'r', encoding='utf-8')
# 2.要通过文件读写操作进行备份
# 2.1.拼接备份后的文件的文件名
copy_file_name = file_name.replace('.', '[备份].')
# copy_file = open(copy_file_name, 'w')
# 在一次打开过程中,用w模式,多次写入,可以继续写入,但在下次打开该文件将会情况
copy_file = open(copy_file_name, 'a', encoding='utf-8') # 最好用追加模式
# 2.2.读取源文件
while True:
content = old_file.read(3)
if content == '':
break
copy_file.write(content) # 写入新文件
# 关闭文件
old_file.close()
copy_file.close()
文件和文件夹的操作
文件的重命名和删除
- rename可以进行文件的重命名或文件移动
- remove 可以进行文件删除
import os # 导入os模块
# os.rename('1.txt', 'hc.txt') # 将文件1.txt重命名为hc.txt
# os.rename('test.txt', 'D_test1/test') # 文件可通过rename进行移动,路径须存在
# os.rename('hc.txt', 'D_test1/acn') # 文件移动的同时进行改名
# remove删除文件不会有任何提示,也不会出现在回收站中,误删后无法回复,删除需谨慎
# os.remove('test[备份].txt')
os.remove('D_test1/acn') # 删除指定目录下的文件
文件夹的操作
- mkdir:创建一个空文件夹,不能创建多级文件夹
- os.makedirs('aaa/bbb/ccc')创建多级目录
- rmdir:删除空文件夹,不能删除有文件的文件夹,removedirs删除多级空目录
- getcwd:获取当前使用的工作目录的路径
- chdir:切换当前的工作目录
- listdir:查询指定的目录结构,将该目录下所有文件名以字符串形式保存在列表中返回
- 括号内不填写任何内容则为查询工作目录的目录结构
- 如果填写路径,则是对指定目录的查询
import os
# mkdir创建文件夹
# os.mkdir('student') # 创建文件夹student
# os.mkdir('student/class1') #在student文件夹里创建文件夹class1,上级目录必存在
# 若上级目录不存在,要创建多级目录用os.makedirs()
os.makedirs('aaa/bbb/ccc') # 创建多级目录
# rmdir删除空文件夹
# os.rmdir('student') # 报错,如果文件夹非空,不能用rmdir删除,需要递归删除
# os.rmdir('student/class1') # 上级目录必须存在
os.removedirs('aaa/bbb/ccc') # 删除多级空目录
# getcwd获取当前使用的工作目录的路径 >> 类似于linux中的pwd
# 默认工作目录就是我们工程所在的根目录
# print(os.getcwd()) # C:\Users\.......\Pythonbase
# chdir切换工作目录 >> 类似于linux中的cd
# os.chdir('student')
# print(os.getcwd()) # C:\Users\......\Pythonbase\student
# listdir指定目录下的目录结构 >> 类似于linux命令中的ls
# print(os.listdir()) # 默认获取当前使用路径下是文件
# ['00python体验.py', '00python创建新文件', '01ss.py', '1[备份].txt', '3练习.py', 'D_test1', 'python.txt', 'student']
# os.chdir('D_test1')
# print(os.listdir()) # ['test']
print(os.listdir('D_test1')) # 获取指定目录下的文件信息['test']
批量修改文件名案例
# 需求:批量修改指定目录下所有文件的文件名
'''
1.修改时可以通过参数控制是增加,还是删除字符
2.传入指定字符用于增加或者删除
3.使用rename进行重命名
'''
# 导入os模块
import os
# 定义一个控制增加还是删除的变量,True是增加 False 是删除
flag = False
# 指定字符的定义
str1 = '[黑马出品]'
# # 构造多个文件:在student目录下构造 test1-test10 十个文件
# for i in range(1, 11):
# open('student/test' + str(i), 'w')
# 定义函数
def modify_files_name(flag, str1, path):
os.chdir(path) # 切换工作目录为指定的目录path
for file_name in os.listdir(): # 遍历指定路径下所有文件名称
if flag:
# 重命名添加文件前缀
os.rename(file_name, str1 + file_name)
else:
# 重命名删除文件名中指定的字符
os.rename(file_name, file_name.replace(str1, ''))
# 将文件目录下所有的文件添加[黑马出品]的前缀
# modify_files_name(flag, str1, 'student') # 前面的flag = True
modify_files_name(flag, str1, 'student') # flag = False