一、文件
文件是存储在存储器上的一组数据序列,可以包含任何数据内容。
文件是数据的抽象和集合。
二、文件类型
文本文件:长字符串
二进制是信息按照非字符但有特定格式形成的文件,文件内部数据的组织格式与文件用途有关
二进制文件和文本文件区别:
1、最主要的区别在于是否有统一的字符编码,二进制文件由于没有统一的字符编码,只能当做字节流,不能看作字符串。
2、无论文件创建为文本文件或者二进制文件,都可以用“文本文件方式”和“二进制文件方式”打开,但打开后的操作不同。
采用文本文件方式读入文件,文件经过编码形成字符串,打印出有含义的字符。
采用二进制方式打开文件,文件被解析为字节流。由于存在编码,字符串中的一个字符由多个字节表示。
f = open("C:\\Users\\520\\Desktop\\a.txt", "tr", encoding="utf-8")
print(f.readline())
f.close()
输出:
送你一朵小红花。
例2:
Traceback (most recent call last):
File "C:/Users/520/PycharmProjects/pythonProject1/guessnum.py", line 1, in <module>
f = open("C:\\Users\\520\\Desktop\\a.txt", "br", encoding="utf-8")
ValueError: binary mode doesn't take an encoding argument
f = open("C:\\Users\\520\\Desktop\\a.txt", "br")
print(f.readline())
f.close()
输出:
b'\xe9\x80\x81\xe4\xbd\xa0\xe4\xb8\x80\xe6\x9c\xb5\xe5\xb0\x8f\xe7\xba\xa2\xe8\x8a\xb1\xe3\x80\x82'
三、文件的打开和关闭
- Python对文本文件和二进制文件采用统一的操作步骤,即“打开-操作-关闭”。
- 操作系统中的文件默认处于存储状态,首先需要将其打开,使得当前程序有权操作这个文件。打开后的文件处于占用状态,此时,另一个进程不能操作这个文件。可以通过一组方法读取文件的内容或向文件写入内容,操作之后需要将文件关闭,关闭将释放对文件的控制使文件恢复成存储状态,此时,另一个进程将能够操作这个文件。
- Python通过open()函数打开一个文件,并返回一个操作这个文件的变量,语法:
文件对象 = open(“文件路径及文件名及扩展名”, “打开模式”)
注意:文件路径及名称及扩展名,"“是转义符和续行符,所以改为”\“或”/"
open()返回的即是文件对象
r为读模式, w, x, a为写模式,t, b为打开模式,可以使用"+"组合使用,形成既表达读写又表达文件模式的方式
r:read,w:wipe,x:exist,a:append,t:text,b:binary
变量名=open(文件名,“r”)
以文本方式打开一个文件,只读模式,读入后不能对文件进行修改
变量名=open(文件名,“r+”)
以文本方式可读写地打开一个文件,可以读入并修改文件
变量名=open(文件名,“a”)
以文本追加写方式打开一个文件,不能读信息
变量名=open(文件名,“a+”)
以文本追加写方式打开一个文件,可以读文件
当文件关闭后,再对文件进行读写将产生I/0操作错误。
四、文件的读取
如果文件以文本文件方式打开,则读入字符串;如果文件以二进制方式打开,则读入字节流。
f.read(),一次性读入整个文件所有内容,返回一个字符串
f.readline(),一次读取一行,返回一个字符串,调用多次读多行
f.readlines(),一次性读入整个文件所有内容,返回一个列表,列表的每个元素是字符串,是文件的每一行
对于大文件,一次性地读入会耗费非常多的时间和资源
f = open("C:\\Users\\520\\Desktop\\a.txt", "rt")
print(f.read(2))
f.close()
输出:新年
f = open("C:\\Users\\520\\Desktop\\a.txt","rt")
print(f.read())
print(type(f.read()))
f.close
输出:
新年都未见芳华,二月初惊见草芽。
白雪却嫌春色晚,故穿庭树作飞花。
<class 'str'>
f = open("C:\\Users\\520\\Desktop\\a.txt","rt")
print(f.readline())
print(type(f.readline()))
f.close
输出:
新年都未见芳华,二月初惊见草芽。
<class 'str'>
f = open("C:\\Users\\520\\Desktop\\a.txt","rt")
print(f.readlines())
print(type(f.readlines()))
print(f.readlines())
f.close
输出:
['新年都未见芳华,二月初惊见草芽。\n', '白雪却嫌春色晚,故穿庭树作飞花。']
<class 'list'>
[] #此时读取指针在文件末尾,再次调用f.readlines()已无法从当前读取指针处读入内容
f = open("C:\\Users\\520\\Desktop\\a.txt", "rt")
print(f.readlines())
f.seek(0) # 将指针重置到文件开头
print(f.readlines())
f.close
输出:
['新年都未见芳华,二月初惊见草芽。\n', '白雪却嫌春色晚,故穿庭树作飞花。']
['新年都未见芳华,二月初惊见草芽。\n', '白雪却嫌春色晚,故穿庭树作飞花。']
遍历全文本一:一次读入,统一处理
遍历全文本二:按数量读入,逐步处理。分批分阶段,对处理大文件更加可行和有效
逐行遍历文件一:一次读入,逐行处理
逐行遍历文件二:分行读入,逐行处理
for line in f,读入的是文件的每一行,是一个字符串,含换行符
f = open("C:\\Users\\520\\Desktop\\a.txt", "rt")
for line in f.readlines(): #逐行遍历文件:一次读入,分行处理
print(line)
f.close()
输出:(两行文字输出之间有两个空行,是因为原文第一行后有一个换行符"\n",print()默认一个换行,共两个空行)
新年都未见芳华,二月初惊见草芽。
白雪却嫌春色晚,故穿庭树作飞花。
f = open("C:\\Users\\520\\Desktop\\a.txt", "rt")
for line in f: #逐行遍历文件:分行读入,逐行处理
print(line)
f.close()
输出:
新年都未见芳华,二月初惊见草芽。
白雪却嫌春色晚,故穿庭树作飞花。
f = open("C:\\Users\\520\\Desktop\\a.txt", "rt", encoding="utf-8")
for line in f:
print(line.replace("\n", "")) #使用replace()去掉读入的换行符
输出:
新年都未见芳华,二月初惊见草芽。
白雪却嫌春色晚,故穿庭树作飞花。
print(line.strip("\n")) #也可以用strip()去掉读入的换行符
注:逐行遍历文件仅针对文本方式,以二进制方式打开没有行的概念。
.
五、文件的写入
- f.wite(),向文件写入字符串或字节流,每次写入后,将会记录一个指针
- f.writelines(),向文件写入一个列表,每次写入后,将会记录一个指针
- 使用f.write(s)和f.writelines()时,都要显式地使用"\n"对写入文本进行分行,如果不进行分行,每次写入的字符串会被连接起来,中间没有空格或其它符号
例1、f.write()未使用换行符进行分行
f = open("C:\\Users\\520\\Desktop\\a.txt", "w")
f.write("新年都未有芳华")
f.write("二月初惊见草芽")
f.write("白雪却嫌春色晚")
f.write("故穿庭树作飞花")
f.close()
例2、f.write()显式地使用换行符"\n"进行分行
f = open("C:\\Users\\520\\Desktop\\a.txt", "w")
f.write("新年都未有芳华\n")
f.write("二月初惊见草芽\n")
f.write("白雪却嫌春色晚\n")
f.write("故穿庭树作飞花\n")
f.close()
例3、f.seek(),指针未重置
ls = ["韩愈(唐)\n", "新年都未有芳华", "二月初惊见草芽", "白雪却嫌春色晚", "故穿庭树作飞花"]
f = open("C:\\Users\\520\\Desktop\\a.txt", "w+")
f.writelines(ls)
for line in f:
print(line)
控制台输出:无输出
例4、f.seek(),读写之后重置指针
ls = ["韩愈(唐)\n", "新年都未有芳华", "二月初惊见草芽", "白雪却嫌春色晚", "故穿庭树作飞花"]
f = open("C:\\Users\\520\\Desktop\\a.txt", "w+")
f.writelines(ls) #写入文件之后,指针位于文件结尾处
f.seek(0)
for line in f:
print(line)
输出:
韩愈(唐)
新年都未有芳华二月初惊见草芽白雪却嫌春色晚故穿庭树作飞花
t.txt内容:abcdefg
f = open("t.txt", "r+")
f.seek(2, 0)
con = f.read()
print(con)
f.close()
输出:cdefg
六、文件备份
需求:用户输入当前目录下任意文件名,程序完成对该文件的备份功能,备份文件格式为XXX[备份],例如:test[备份].txt。
# 1.接收用户输入的目标文件
old_name = input("请输入要备份的文件名:")
# print(old_name)
# 2.规划备份文件的名字
# 2.1 提取扩展名 -- 找到名字中的点 -- 名字和扩展名分离
# 2.2 最右侧的点才是扩展名--字符串查找某个子串
index = old_name.rfind(".")
# print(index)
# 2.3 组织新名字,原名+[备份]+扩展名
# 有效文件才备份
if index > 0:
postfix = old_name[index:]
new_name = old_name[:index] + '[备份]' + postfix
# print(new_name)
# 3.备份文件写入数据
# 3.1打开源文件和备份文件
old_f = open(old_name, "rb")
new_f = open(new_name, "wb")
# 3.2源文件读取,备份文件写入
# 如果不确定目标文件大小,循环读取写入,当读取出来的数据没有了停止循环
while True:
con = old_f.read(1024)
if len(con) == 0:
break
new_f.write(con)
# 3.3关闭两个文件
old_f.close()
new_f.close()
七、文件的操作
在Python中⽂文件和⽂文件夹的操作要借助os模块⾥里里⾯面的相关功能,步骤:
- 导入OS模块,import os
- 使用OS模块相关功能,os.函数名()
1、文件重命名
os.rename(目标文件名, 新文件名)
2、删除文件
os.remove(目标文件名)
import os
# os.rename("t.txt", "t2.txt")
os.remove("t2.txt")
八、文件夹的操作
1、创建文件夹
import os
os.mkdir("aa")
print(os.path)
如果文件夹已存在,报错:
2、删除文件夹
import os
os.rmdir("aa")
3、获取当前文件所在目录
import os
print(os.getcwd())
4、改变默认目录
import os
os.mkdir("C:\\Users\\520\\Desktop\\aa")
os.chdir("C:\\Users\\520\\Desktop\\aa")
os.mkdir("bb") # 在aa文件夹下创建bb文件夹 C:\Users\520\Desktop\aa\bb
5、获取目录列表,返回一个列表list,元素为各个文件名字符串(不含路径)
import os
print(os.listdir()) # 返回当前代码文件夹下的所有文件
import os
print(os.listdir("C:\\Users\\520\\Desktop"))
6、重命名文件夹,rename既可以重命名文件,也可以重命名文件夹
import os
# os.mkdir("aa")
os.rename("aa","aaaa")
九、应用案例
需求:批量量修改⽂件名,既可添加指定字符串,⼜能删除指定字符串
# 添加指定字符串,构造新名字
# 1,找到所有文件
# 1,1找到所有文件:获取文件夹目录列表 -- listdir()
import os
os.chdir("C:\\Users\\520\\Desktop\\aa")
file_list = os.listdir()
# 2,构造名字
for i in file_list:
new_name = "new_" + i
# 3,重命名
os.rename(i, new_name)
优化:
# 添加指定字符串,构造新名字;删除指定字符串,构造新名字
# 1,找到所有文件
# 1,1找到所有文件:获取文件夹目录列表 -- listdir()
import os
dir_name = "C:\\Users\\520\\Desktop\\aa"
# os.chdir("C:\\Users\\520\\Desktop\\aa")
file_list = os.listdir(dir_name)
print(file_list)
# 设置重命名标识:如果为1则添加指定字符,flag取值为2则删除指定字符
flag = 1
# 2,构造名字
for i in file_list:
if flag == 1:
new_name = "new_" + i
# 删除指定字符
elif flag == 2:
num = len("new_")
new_name = i[num:]
# 打印新⽂文件名,测试程序正确性
print(new_name)
# 3,重命名
os.rename(dir_name + "\\" + i, dir_name + "\\" + new_name)
十、文件小结
- w,文件指针在开头,会覆盖原内容
- r,文件指针在开头,向下可以读入数据
- a,文件指针在结尾,向下读不出数据,通过seek(偏移量,位置)改变指针位置
十一、小结
PS: source, python123