Python文件操作
一、文件的编码
1.1 背景
thinking:计算机只能识别:0和1,那么我们丰富的文本文件是如何被计算机识别,并存储在硬盘中呢?
answer:使用编码技术(密码本)将内容翻译成0和1存入。
编码技术即:翻译的规则,记录了如何将内容翻译成二进制,以及如何将二进制翻译回可识别内容。
计算机中有许多可用编码:
- UTF-8
- GBK
- Big5
- ...
不同的编码,将内容翻译成二进制也是不同的。
UTF-8是目前全球通用的编码格式。除非有特殊需求,否则,一律以UTF-8格式进行文件编码即可。
1.2 总结
二、文件的读取
2.1 什么是文件
内存中存放的数据在计算机关机后就会消失。要长久保存数据,就要使用硬盘、光盘、U 盘等设备。为了便于数据的管理和检索,引入了“文件”的概念。
一篇文章、一段视频、一个可执行程序,都可以被保存为一个文件,并赋予一个文件名。操作系统以文件为单位管理磁盘中的数据。一般来说,文件可分为文本文件、视频文件、音频文件、图像文件、可执行文件等多种类别。
2.2 文件操作的内容
在日常生活中,文件操作主要包括打开、关闭、读、写等操作。
2.3 文件的操作步骤
大概可以分为三个步骤(简称文件操作三步走):
①打开文件
②读写文件
③关闭文件
注意
:可以只打开和关闭文件,不进行任何读写。
2.3.1 open()打开函数
在Python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件,语法如下
open(name, mode, encoding)
name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)。
mode:设置打开文件的模式(访问模式):只读、写入、追加等。
encoding:编码格式(推荐使用UTF-8)
实例代码:
f = open('python.txt', 'r', encoding='UTF-8') # encoding的顺序不是第三位,所以不能用位置参数,用关键字参数直接指定
注意:此时的'f'是'open'函数的文件对象,对象是Python中一种特殊的数据类型,拥有属性和方法,可以使用对象.属性或对象.方法对其进行访问,w相当于是覆盖写入。
mode常用的三种基础访问模式
2.3.2 读操作相关方法
read()方法:
文件对象.read(num)
num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据。
readlines()方法:
readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。
f = open('python.txt') content = f.readlines() # ['hello world\n', 'abcdefg\n', 'aaa\n', 'bbb\n', 'ccc'] print(content) # 关闭文件 f.close()
readline()方法,一次读取一行内容
f = open('python.txt') content = f.readline() print(f'第一行{content}') content = f.readline() print(f'第二行{content}') # 关闭文件 f.close()
for循环读取文件行
for line in open('python.txt', "r"): print(line) # 每一个line临时变量,就记录了文件的一行数据
close():关闭文件对象
f = open('python.txt', "r") f.close() # 最后通过close,关闭文件对象,也就是关闭对文件的占用 # 如果不调用close,同时程序没有停止运行,那么这个文件将一直被python程序占用。
with open语法
with open('python.txt', 'r') as f: f.readlines() # 通过在with open的语句块中对文件进行操作 # 可以在操作完成后自动关闭close文件,避免遗忘掉close方法
2.3.3 操作汇总
2.3.4 总结
2.3.5 课后练习:单词计数
# 通过文件读取操作,读取文件word.txt,统计itheima单词出现的次数 # 打开文件,以读取模式打开 # 我的思路 # with open("word.txt") as f: # contents = f.readlines() # count = 0 # print(contents) # for content in contents: # content.split(" ") # if content.count("itheima"): # count += 1 # print(f"itheima出现了{count}次") # 参考其他方法 f = open("word.txt", "r", encoding="UTF-8") # 方式2:读取全部内容,通过字符串count统计itheima单词数量 # content = f.read() # count = content.count("itheima") # print(f"itheima在文件中出现了:{count}次") # 方式三:读取内容,一行一行读取 count = 0 # 使用count变量来累计itheima出现的次数 for line in f: line = line.strip() # 去除开头和结尾的空格以及换行符 words = line.split(" ") for word in words: if word == "itheima": count += 1 # 如果单词是itheima,进行数量的累加加1 # 判断单词出现次数并累计 print(f"itheima出现的次数是:{count}") # 关闭文件 f.close()
三、文件的写入
3.1 案例演示:
# f.write("Hello world1111!") # 内容写到内存中 # flush刷新 # f.flush() # 将内存中积攒的内容,写入到硬盘 # close关闭 # f.close() # close方法,内置了flush的功能的 f = open("test.txt", "w", encoding="UTF-8") # write写入、flush刷新 f.write("小鲍学python") # close关闭 f.close()
注意:
- 直接调用write,内容并为真正写入文件,而是会积攒在程序的内存中,称之为缓冲区
- 当调用flush的时候,内容才会真正写入文件
- 这样做是避免频繁地操作硬盘,导致效率下降(攒一堆,一次性写入磁盘)
写操作注意
- 文件如果不存在,使用”w”模式,会创建新文件
- 文件如果存在,使用”w”模式,会将原有内容清空
3.2 总结
四、文件的追加
4.1 追加写入操作快速入门
""" 演示文件的追加写入 """ # 打开文件,不存在的文件 # f = open("test1.txt", "a", encoding="UTF-8") # # write写入 # f.write("小鲍学python") # # flush刷新 # f.flush() # # close关闭文件 # f.close() f = open("test1.txt", "a", encoding="UTF-8") # write写入,flush刷新 f.write("\n月薪过万") # close()关闭 f.close()
注意:
- a模式,文件不存在会创建文件
- a模式,文件存在会在最后,追加写入文件
4.2 追加操作总结
五、文件操作综合案例
5.1 完成文件备份案例
需求分析
需求:有一份账单文件,记录了消费收入的具体记录,内容如下:
name,date,money,type,remarks
周杰轮,2022-01-01,100000,消费,正式
周杰轮,2022-01-02,300000,收入,正式
周杰轮,2022-01-03,100000,消费,测试
林俊节,2022-01-01,300000,收入,正式
林俊节,2022-01-02,100000,消费,测试
林俊节,2022-01-03,100000,消费,正式
林俊节,2022-01-04,100000,消费,测试
林俊节,2022-01-05,500000,收入,正式
张学油,2022-01-01,100000,消费,正式
张学油,2022-01-02,500000,收入,正式
张学油,2022-01-03,900000,收入,测试
王力鸿,2022-01-01,500000,消费,正式
王力鸿,2022-01-02,300000,消费,测试
王力鸿,2022-01-03,950000,收入,正式
刘德滑,2022-01-01,300000,消费,测试
刘德滑,2022-01-02,100000,消费,正式
刘德滑,2022-01-03,300000,消费,正式
要求将内容复制并保存为 bill.txt文件
""" 演示文件操作综合案例:文件备份 """ # 我的写法,一开始理解有误了,题目的要求是测试的数据不需要备份到bak文件 # 读取文件 # f = open("bill.txt", "r", encoding="UTF-8") # # 将文件写出到bill.txt.bak文件作为备份 # f_bak = open("bill.txt.bak", "w", encoding="UTF-8") # flag = True # for lines in f: # for line in lines: # if line == "测" or line == "试": # flag = False # if flag: # f_bak.write(lines) # flag = True # # # 关闭文件 # f.close() # f_bak.close() # 参考写法 # 打开文件得到文件对象,准备读取 fr = open("bill.txt", "r", encoding="UTF-8") # 打开文件得到文件对象,准备写入 fw = open("bill.txt.bak", "w", encoding="UTF-8") # for循环读取文件 for line in fr: line = line.strip() # 判断内容,将满足的内容写出 if line.split(",")[4] == "测试": continue # 将内容写出去 fw.write(line) # 由于前面对内容进行了strip()的操作,所以要手动的写出换行符 fw.write("\n") # close2个文件对象 fr.close() fw.close() # 写出文件调用close()会自动flush()