Python文件(一):文件类型、文件的打开,读取写入,关闭、文件备份、文件和文件夹的操作

一、文件

文件是存储在存储器上的一组数据序列,可以包含任何数据内容。
文件是数据的抽象和集合。
在这里插入图片描述

二、文件类型

在这里插入图片描述
文本文件:长字符串
在这里插入图片描述
二进制是信息按照非字符但有特定格式形成的文件,文件内部数据的组织格式与文件用途有关
在这里插入图片描述

在这里插入图片描述
二进制文件和文本文件区别:
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

猜你喜欢

转载自blog.csdn.net/weixin_47008635/article/details/113920078