week03day03(文件操作、正则表达式1)

一、文件操作

1.数据持久化(数据本地化) -- 将数据保存在硬盘

  • 程序中的数据默认是保存在运行内存中的,保存在运行内存中的数据在程序运行结束后会自动释放。
  • 如果希望在程序结束后,数据仍可以使用,就必须把数据保存在硬盘中。硬盘中的数据除非人为删除或者硬盘损坏否则数据会一直存在。
  • 如果想要把数据保存到硬盘中必须把数据保存到文件 中(文件是硬盘保存数据的基本单位)

2. 常见的数据持久化工具

  • 数据库文件(.db .sqlite) 、json文件、plist文件、txt文件、excel文件、 csv文件

3. python如何做数据持久化 -- python如何将程序中数据保存到文件中、如何获取文件中的数据到程序中使用

1.文件操作 ------ 操作文件内容
2. 文件操作基本步骤:
  • 第一步:打开文件
  • 第二步:操作文件内容(读写操作)
  • 第三步:关闭文件

4.文件如何操作

1. 打开文件

python 复制代码
'''
语法:open(file,mode = 'r', *, encoding=None)  -- 以指定方式打开指定文件

a.   file       --- 字符串;需要打开的文件路径
                 文件路径可以写绝对路径也可以写相对路径
                 1. 绝对路径: 文件在计算机的全路径(windows是从盘名开始写,mac或者linux从系统根目录或者用户根目录开始写)
                 open(r'/c:/names/users/abc/files/a.txt') #r 是电脑一般斜杠是反的 所以r确保斜杠对
                    路径名需要引号框起来
                 2.相对路径 :如果使用相对路径必须先将需要打开的文件直接或者间接放在项目里
                    a.  用 .开头, .表示当前目录(当前代码文件所在文件夹)
                    open('./files/data.txt') 相对路径如果以 './'开头,'./'可以省略
                    b.  以 ..开头 ,用..表示当前目录上次目录



b.     mode             字符串,文件的打开方式  -- 决定打开文件后能做什么(读?写?)
                        决定操作文件的时候对应的数据的数据类型
                        根据mode的功能他的值有两组:
                        1. 第一组值   - 决定打开文件后能干什么(读还是写)
                        r      - 只读
                        w      - 只写;在打开文件时会清空文件内容
                        a(append mode)     - 只写;在打开文件的时候会保留文件内容
                        注意: 以读的方式打开一个不存在的文件程序会报错,
                              以写的方式打开不存在文件不会报错 且会自动创建这个文件


                        2. 第二组值      -- 决定操作文件的时候对应的数据的数据类型
                        t -text mode(默认值)       - 读写数据必须是字符串
                        b - 读写数据必须是字节(bytes) (一般是视频、音频、图片,非文本文件只能用b方式打开)
                        注意: 给mode 赋值时候必须在两组值中每一组中选择一个,第二组值不选表示选t,两组值顺序不影响


c.  encoding            编码方式: 1.gbk: 只支持英文、中文、韩文和日文编码,英文是单字节编码,用双字节存储一个中文字符
                                 2.utf-f: 支持所有语言,用三个字节存储一个中文字符
                                 3.(8bit = 1bytes 1kb =1024bytes  1mb = 1024kb  1G = 1024mb)
                        不同文本文件编码方式在保存同一个字符的编码值的时候采用字节数可能不同
                        使用文本文件编码方式的基本原则:将数据写入文件时使用的编码方式必须和读文件中内容时采用编码方式一致


'''

open('/Users/yaoxin/Documents/afile.txt' ) #绝对路径
open('./afile1.txt')  # afile1 和 我这个代码文件同级,所以直接当前目录就可以, ./也可以省略
open('../day03/afile1.txt') #当前代码文件上一级是week03,week03/day03/afile1

f = open('afile1.txt','r')
f.read()
f.write('phth') #会报错,因为现在是r(只读模式)

f = open('afile1.txt','a')
f.read() #报错,现在是append mode 模式,
f.write('python') 只写,且会在原文件内容后添加

f = open('afile1.txt','w')  # 打开时,原文件内容会被清空,如果文件不存在,会自动创建


f = open('afile1.txt','rt')
result = f.read()
print(type(result)) # str

f = open('afile1.txt','rb')
result = f.read()
print(type(result)) # bytes

1.1 自动关闭(with open)

python 复制代码
with open('../day03/afile1.txt','r',encoding='utf-8') as f:
    print(f.read())
    

2. 文件读操作

a. 文件对象.read() --- 获取整个文件内容,并返回(从文件读写位置开始读到文件结束,文件读写位置默认在文件开头)
  • 读取一次后,再赋值再read,是没结果的。 需要重新open一次,或者移动光标到开头,用seek(0), 下面是事例
python 复制代码
f = open('afile1.txt', 'rt',encoding='utf-8')
result = f.read()
print(result)


## 这样再赋值无结果
result1 = f.read()
print(result1) 

# 再open一次,可以再输出
f = open('afile1.txt', 'rt',encoding='utf-8')
result = f.read()
print(result)

#或者seek(0) 移动到开头

f.seek(0)
result1 = f.read()
print(result1)
b. 文件对象.readline() --- 读取一行内容
python 复制代码
f = open('afile1.txt', 'rt',encoding='utf-8')
#result = f.readline()
print(f.readline()) #hellohello世界hello世界hello世界hello世界hello世界hhellohello
print(f.readline()) #dfdfdfdf的大方大方
print(f.readline()) #print(f.readline())
练习:循环打印afile1 所有内容
python 复制代码
f = open('afile1.txt', 'rt',encoding='utf-8')
while True:
    result = f.readline()
    print(result)
    if not result:
        break

3. 文件写操作

  • 文件对象. write(内容)
python 复制代码
f = open('afile1.txt', 'wt',encoding='utf-8')
f.write('你好世界')

4. 关闭文件

  • 文件对象.close( )
python 复制代码
f = open('afile1.txt', 'r',encoding='utf-8')
print(f.read())

f.close()
  • 已经关闭的文件不能再进行读写操作

二. 应用

1. 如何实现程序中的数据持久化

  • 第一步:确定需要做持久化的数据是什么
  • 第二步:确定保存数据的文件( 文件叫什么名字、文件类型、文件位置、文件的初始内容是什么)
  • 第三步:做到在程序中需要这个持久化数据的时候从文件中去读这个数据;当这个数据变化的时候需要把最新的数据更新到文件中。

案例: 写程序打印程序启动的次数

python 复制代码
#count.txt 的内容就是0
#获取保存在文件中上一次程序的启动次数
f = open('count.txt','r',encoding='utf-8')
count = int(f.read()) #count 文件里就只有一个0,读取他出来
f.close()

count += 1
print(count)

# 将最新的次数更新到文件中
f = open('count.txt','w', encoding='utf-8')
f.write(str(count)) #count 是int 要转换成 str才可以写入
f.close()

练习:

练习1:写程序录入学生的名字,录入完后打印目前已经录入过的所有的学生的名字(每次运行程序只录入一个)

"""

请输入学生的名字:小名

小名

请输入学生的名字: 张三

小名 张三

请输入学生的名字: 李四

小名 张三 李四

...

"""

录入学生的名字,录入完后打印目前已经录入过的所有的学生名字

python 复制代码
student_name = input('请输入学生的姓名:')
file1 = open('afile1.txt','at',encoding='utf-8')
file1.write(student_name)
  • 需要持久化的数据是:所有录入学生的姓名
  • txt文件可以保存名字

练习2:写程序录入学生的名字,录入完后打印目前已经录入过的所有的学生的名字,但是每个名字只能录入一次!

python 复制代码
student_name = input('请输入学生的姓名:')

# 读取文件内容
file1 = open('afile1.txt', 'rt', encoding='utf-8')
file1_content = file1.read()
file1.close()

if student_name in file1_content:
    print('名字已经存在')
else:
    file1 = open('afile1.txt', 'at', encoding='utf-8')
    file1.write(student_name + ' ')
    file1.close()
    print('名字已添加到文件中')

# 重新读取文件内容并打印
file1 = open('afile1.txt', 'rt', encoding='utf-8')
updated_content = file1.read()
file1.close()
print(updated_content)

三. 正则表达式

1. 正则表达式的定义:

  • 正则表达式是一种可以让复杂的字符串问题变得简单的工具
  • 不管通过正则表达式解决的是什么样的字符串问题,写正则表达式都是在描述字符串规则

2.python中正则相关的基本工具

  • re模块 -- 是python自带的模块,这个模块中提供了各种各样和正则相关的函数

  • fullmatch函数: fullmatch(正则表达式, 字符串) --- 判断整个字符串是否符合正则表达式所描述的规则,如果不符合结果为None, 符合结果是匹配对象

  • python中正则表达式写法: r'正则表达式内容'

3.正则符号

1. 普通符号: 在正则表达式中表示符号本身符号就是普通符号
python 复制代码
result = fullmatch(r'abc','abc')
print(result)
2. ' . ' 匹配任意一个字符,(长度也需要匹配)
python 复制代码
# . 表示任意字符, 就是说第一个随便是什么,后面两个是 bc 就行,长度也要匹配
result = fullmatch(r'.bc','kbc')
print(result)

result = fullmatch(r'..bc..','abbcld')
print(result)
3. ' \d ' 匹配任意一个数字字符 (digit)
python 复制代码
result = fullmatch(r'\dbc','9bc')
print(result)

#任意三个数字字符
result = fullmatch(r'\d\d\d','365')
print(result)
4. \s 匹配任意一个空白字符(包括空格、\n \t)
python 复制代码
result = fullmatch(r'\d\s\d','2\n5')
print(result)
5. \w 匹配任意一个数字、字母、下划线或中文
python 复制代码
result = fullmatch(r'1\w3','1是3')
print(result)
6. \D 、 \S 、\W
  • \D :匹配任意一个非数字字符
  • \S : 匹配任意一个非空白字符
  • \W : 匹配任意一个非(数字、字母、下划线或着中文)
7. [字符集] --- 匹配在字符集中的任意一个字符
python 复制代码
result = fullmatch(r'1[abc]2','1c2')
print(result)
  • 匹配abc 中任意一个字符都可以
  • [\dMN] 匹配任意一个数字和MN
  • r'a[3-9]b' a和b 中间 3-9中任意一个 , r'1[a-zA-Z]2' , 1和2 之间是任意一个小写或大写字母, 加空格的话,就是或的意思
  • r'1[\da-fMN]3' , 三个字符,中间的可以是数字,也可以是a-f的任意一个,或者MN
8. [^字符集] --- 匹配不在字符集的任意字符
  • r'1[^a-z]2' 1和2之间不是小写字母
相关推荐
不去幼儿园22 分钟前
【MARL】深入理解多智能体近端策略优化(MAPPO)算法与调参
人工智能·python·算法·机器学习·强化学习
幽兰的天空1 小时前
Python 中的模式匹配:深入了解 match 语句
开发语言·python
网易独家音乐人Mike Zhou5 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
安静读书5 小时前
Python解析视频FPS(帧率)、分辨率信息
python·opencv·音视频
小二·6 小时前
java基础面试题笔记(基础篇)
java·笔记·python
小喵要摸鱼8 小时前
Python 神经网络项目常用语法
python
一念之坤9 小时前
零基础学Python之数据结构 -- 01篇
数据结构·python
wxl78122710 小时前
如何使用本地大模型做数据分析
python·数据挖掘·数据分析·代码解释器
NoneCoder10 小时前
Python入门(12)--数据处理
开发语言·python
LKID体11 小时前
Python操作neo4j库py2neo使用(一)
python·oracle·neo4j