传送门==>B站黑马python入门教程
目录
- [1. 文件编码概念](#1. 文件编码概念)
- 2.文件的读取操作
-
- [2.1 基础学习](#2.1 基础学习)
- [2.2 练习](#2.2 练习)
- 3.文件的写入操作
- 4.文件的追加写入操作
- 5.练习
1. 文件编码概念
计算机只能识别到 0 和1, 那么对于丰富的文本文件是如何被计算机识别,且存储到硬盘中?
使用编码技术(密码本)将内容翻译为0/1存储;

编码技术:翻译规则-记录如何将内容翻译为二进制,以及如何将二进制翻译回可识别的内容;
计算机中有许多的可用编码:
- UTF8(目前通用的默认编码形式)
- GBK
- Big5
- ...
不同的编码,翻译内容时转换的二进制也是不同的;
1.什么是编码?编码就是规则集合,记录了内容与二进制之间的相互转换逻辑;
编码有许多种,常用的是UTF-8编码;
2.为什么需要使用编码?计算机只认识0和1,所以需要将内容翻译为0和1才能保存到计算机中;
同时也需要编码,将计算机保存的0和1,反向翻译回可以识别的内容;
2.文件的读取操作
2.1 基础学习
文件:
内存中存放的数据在计算机关机后就会消失,要长久保存数据,就要使用硬盘,光盘,U盘等设备,为了便于数据的管理和检索,
引入文件概念
文章/视频/可执行的程序,都可以被保存为一个文件,并且赋予一个文件名.
操作系统以文件为单位管理了磁盘中的数据,正常状况下,文件可以分为文本文件,视频文件,音频文件,图像文件,可执行文件等多种类别;
日常使用文件时,主要有打开,关闭,读取,写入...操作

平时对文件的基本操作,大概可分为三步:(注:可以只打开/关闭文件,不进行任何的读写)
- 打开文件
- 读写文件
- 关闭文件
open()打开函数
在python中,使用open函数,可打开一个已存在的文件,或者去创建出一个新的文件;
语法:open(name, mode,encoding)
name:要打开的目标文件名的字符串,可以包含文件所在的具体路径;
mode:设置打开文件的模式(访问模式):只读,写入,追加等;
encoding:编码格式(推荐使用UTF-8)
python
# 打开文件
f = open("F:/pythonworkspace/startDemo/fileDemopath/demo.txt", "r", encoding="utf-8")
print(f"类型为:{type(f)}")
print(f"文件名:{f.name}")
print(f"访问模式:{f.mode}")
print(f"是否已关闭:{f.closed}")
print(f"文件编码:{f.encoding}")
print(f"文件大小:{f.tell()}")

注:此时的f是open函数的文件对象,对象是python中一种特殊的数据类型,拥有属性和方法,
可以使用对象.属性或者对象.方法 对其进行访问

读操作相关方法
- read()方法:
文件对象.read(num)
num:要从文件中读取的数据长度(单位-字节),若没有传入num,就是要读取文件中的所有数据;
python
# 读取文件
print(f"读取4个字节内容:{f.read(4)}")
print(f"读取所有内容:{f.read()}")

- readlines()方法:
可以按照行的方式把整个文件的内容进行一次性读取,且返回一个列表,每一行的数据为一个元素;
python
# readlines
list = f.readlines()
print(f"list的类型为{type(list)}")
print(f"list的内容为{list}")

- readline():一次只读取一行内容;
python
# readline
print(f"文件的第一行内容:{f.readline()}")
print(f"文件的第二行内容:{f.readline()}")
print(f"文件的第三行内容:{f.readline()}")
print(f"文件的第四行内容:{f.readline()}")

- for 循环读取文件换行
每次读取临时变量的作为一部分,就是记录了文件的一行内容
python
for 循环读取文件换行
# 每次读取临时变量的作为一部分,就是记录了文件的一行内容

- 关闭文件
文件.close()
python
f.close()
with open该语句块读取文件后会自动关闭文件
python
with open("F:/pythonworkspace/startDemo/fileDemopath/demo.txt", "r", encoding="utf-8") as f:
print(f.readlines())

2.2 练习
文件读取联系:单词计数;
创建一个txt文件,然后写一写内容;统计python这个单词出现的次数;
python
def count_word(line,word):
"""
统计一行数据中固定单词出现的次数;
:param line 文本
:param word 单词
"""
count = 0
# line是一段长文本没有空格什么的
for i in range(len(line)):
if line[i:i+len(word)] == word:
count += 1
return count
f = open("F:/pythonworkspace/startDemo/fileDemopath/practice.txt", "r", encoding="utf-8")
count = 0
for line in f:
count += count_word(line,"python")
f.close()
print(f"python出现的次数为:{count}")


3.文件的写入操作
- 打开文件
- 文件写入
- 内容刷新
python
案例
f = open('demo.txt'.,'w')
f.write("hello world")
f.flush()
注:
- 直接调用write,内容并未真正写入文件,而是会积攒在程序的内存中:缓冲区
- 当调用flush时,内容才真正地写入文件了
- 这样可以避免频繁操作硬盘,导致效率下降
4.文件的追加写入操作
在文件写入的基础上,文件操作模式调整为'a'模式-追加写入;
注:
- 文件不存在时会创建文件
- 文件存在会在最后,追加写入文件
python
f = open("F:/pythonworkspace/startDemo/fileDemopath/demo2.txt", "a", encoding="utf-8")
f.write("追加写入的内容")
f.flush()

5.练习
文本数据备份
对于demo3的文件,
- 读取文件,然后将文件写入到demo3_back.txt
- 然后同时将文件中标记为测试类型的数据行丢弃
- open()和r模式打开一个文件对象,且读取文件
- open()和w模式打开另一个文件对象,且进行文件写出
- for循环内容,判断是否是测试,不是测试就写出,如果是测试就continue跳过
- 将文件关闭;

python
# 读取原文件
f = open("F:/pythonworkspace/startDemo/fileDemopath/demo3.txt", "r", encoding="utf-8")
# 备份的文件
f_back = open("F:/pythonworkspace/startDemo/fileDemopath/demo3_back.txt", "w", encoding="utf-8")
# 操作文件
for line in f:
# 去除换行符
line = line.strip()
type = line.split(",")[4]
if type != "测试":
f_back.write(line + "\n")
else:
continue
f_back.flush()
f.close()
f_back.close()
