221012 Python学习:文件操作、数据持久化、数据持久化相关方法、eval函数的用法

221012 Python学习:文件操作、数据持久化、数据持久化相关方法、eval函数的用法

一、数据相关基础和文件操作

1)数据存储
  • 程序中的数据默认是保存在运行内存中的;保存在运行内存中的数据在程序运行结束后会自动销毁。 —— 就会导致这次运行程序产生的数据在下一次运行程序的时候无法使用。
  • 如果将数据保存在磁盘中,除了人为删除或者磁盘损坏,数据就会一直存在(磁盘是以文件为单位保存数据的)
2)数据持久化
  • 数据持久化就是指将数据以文件的形式保存到磁盘中;
  • 常见的数据持久化工具:数据库文件(.db、.sqlite)、json文件(.json)、excel文件、csv文件、txt文件、plist文件
3)文件操作:操作文件内容

文件操作基本流程:打开文件 → 操作文件(读、写) → 关闭文件

  • 打开文件:open(file, mode= ‘r’, encoding=None) ,以指定的方式打开指定文件返回一个文件对象

    1. file — 文件路径(文件在计算机中的位置)

      • 绝对路径:文件在计算机中的全路径(Windows从盘开始写)

      • 相对路径(必须将需要打开的文件放在工程目录)

        写路径的时候用. 表示当前目录(当前目录是指当前代码所在文件所在的文件夹)

        写路径的时候用… 表示当前目录的上级目录

      # 绝对路径(可以复制文件地址看绝对路径)
      path = r'D:\Hycpython\Day15 文件操作\files\test1.txt'
      open(path)
      
      # 相对路径
      # path = r'.\files\test1.txt'
      path = './files/test1.txt'
      open(path)
      
      path = '../Day15 文件操作/files/test1.txt'
      open(path)
      
    2. mode — 文件打开方式

      (决定打开文件后是能读还是能写?决定打开文件后操作文件的时候对应的数据的类型是字符串还是二进制)

      • 第一组值(决定读写方式):

        r — 只读 (默认是r)

        w — 只写,打开的时候会清空原文件内容

        a — 只写。打开的时候不会清空原文件内容

        **注意:**如果文件不存在,以读的方式打开会报错,以写的方式打开不但不会报错还会自动创建这个文件。

      • 第二组值(决定数据类型)

        t — 字符串类型(默认是t)

        b — 二进制类型

        **注意:**给mode赋值的时候必须在两组值中每组值选择一个选项:‘rt’、‘tr’、‘r’…等;

        **注意:**打开文本文件可以使用t 也可以用b (一般使用t),但是二进制文件(图片、音频、视频)等只能用b打开。

      # 读写方式
      # ============r只读=============
      f = open('files/test1.txt', 'r')
      f.read()
      # f.write('abc')                # 报错
      
      print('-------------------------------------------')
      
      # ============w只写且会清空原文件=============
      f = open('files/test1.txt', 'w')
      f.write('abc')
      # f.read()                   # 报错
      
      print('-------------------------------------------')
      
      # ============a只写且不会清空原文件=============
      f = open('files/test1.txt', 'a')
      f.write('abc')
      # f.read()                   # 报错
      
      print('-------------------------------------------')
      
      
      # 数据类型
      
      # ============t对应的是字符串=============
      f = open('files/test1.txt', 'rt')
      result = f.read()
      print(result, type(result))
      
      print('-------------------------------------------')
      
      # ============b对应的是二进制=============
      f = open('files/test1.txt', 'rb')
      result = f.read()
      print(result, type(result))     # b'abcabc' 
      print('-------------------------------------------')
      
    3. encoding — 文件编码方式(只有在以t的方式打开文件的时候才需要设置encoding)

      不同文本的文件编码方式保存同一个字符的时候采用内存大小可能不一样

      最常见的两种值:

      • utf-8:一个中文字符用3个字节,英文字符1个字节;
      • gbk:一个中文字符用2个字节,英文字符1个字节。

      **使用原则:**数据写入文件采用的编码方式要的读文件数据对应的编码方式一致

      f = open('files/test1.txt', 'w', encoding='utf-8')
      result = f.write('hhhxxx12')
      print(result)		# 8
      
      f = open('files/test1.txt', 'r', encoding='utf-8')
      result = f.read()
      print(result)		# hhhxxx12
      
4)文件的读写操作
  1. 文件的读操作

    • 文件对象.read — 从读写位置开始读到文件结束(获取整个文件的内容)

    • 文件对象.readline — 从读写位置开始到一行结束(只能用于文本文件)

    • 文件对象.readlines — 多行读完,读到文件结束

      **文件对象.seek(0)**将读写位置移动到文件开头

    f = open('files/abc.txt', 'r', encoding='utf-8')
    result = f.read()
    print(result)
    print('-------------------------------------------')
    
    # 将读写位置移动到文件的开头(否则再次读文件,需要再重新打开文件)
    f.seek(0)       # 移动到开头
    result1 = f.read()
    print(result1)
    print('-------------------------------------------')
    
    f.seek(0)
    print(f.readline())     # 商女不知亡国恨,/n
    print('-------------------------------------------')
    print(f.readline())
    print(f.readline())     # 读到最后一行结束后,是''
    

    练习⭐:

    # 有一个文件对象:poetry.txt
    # 文件中的内容:
    """
    烟笼寒水月笼沙,
    夜泊秦淮近酒家。
    商女不知亡国恨,
    隔江犹唱后庭花。
    """
    
    # 练习:一行一行的读文件poetry.txt内容,直到读完为止。
    # 打开文件
    f = open('files/poetry.txt', 'r',encoding= 'utf-8')
    # while循环读取文件内容
    while True:
        result = f.readline()
        # 当变量result为空字符串,就说明读完了
        if result == '':
            break
        print(result)
    
    # 将读取一行一行的诗歌内容和生成器结合
    def read_line():
        f1 = open('files/bbb.txt', 'r', encoding='utf-8')
        while True:
            result = f1.readline()
            if result == '':
                break
            yield result
    
    gen = read_line()
    print(next(gen))
        
    
  2. 文件的写操作:文件对象.write

    f = open('files/poetry.txt', 'a', encoding='utf-8')
    f.write('烟笼寒月水笼沙,夜泊秦淮近酒家')
    
  3. 关闭文件:文件对象.close

二、数据持久化的方法

总结:数据持久化的步骤

  1. 第一步:确定持久化的对象
  2. 第二步:创建文件,并且确定文件的初始内容(确定存储策略)
  3. 第三步:在程序中需要整个被持久化的数据的时候从文件中读数据;数据如果发生改变要将最新的数据写入到文件中。

⭐练习:

# 案例:添加学生
"""
请输入学生的名字:小明
小明

请输入学生的名字:小花
小明 小花
"""

name = input('请输入名字:')
f = open('files/names.txt', 'w', encoding='utf-8')
f.write(name + '')
f.close

f = open('files/names.txt', 'r', encoding='utf-8')
result = f.read()
print(resulrt)
f.close

⭐⭐案例:

# 案例2:写程序打印程序运行次数

# f = open('files/count.txt', 'w', encoding='utf-8')
# f.write('0')
# f.close()
# 上面部分代码执行一次后就可以注释掉了,可以用捕捉异常来做


# f = open('files/count.txt', 'r', encoding='utf-8')
# count = int(f.read())
# f.close()
#
# count += 1
# print(count)
#
# f = open('files/count.txt', 'w', encoding='utf-8')
# f.write(str(count))
# f.close()

三、eval函数的用法

**基本用法:**将满足某种数据类型结构的数据字符串转换成对应类型的数据

result = eval('100')
print(result, type(result))			# 100 

result = eval('(12, 13)')
print(result, type(result))			# (12, 13) 

result =eval('[10, 20, 30]')
print(result, type(result))			# [10, 20, 30] 

result = eval('{"a": 17}')
print(result, type(result))			# {'a': 17} 

**eval函数本质:**就是去掉字符串的引号获取引号中表达式的结果

result = eval('100 + 200')
print(result)           # 300

x = 100
result = eval('x * 2')
print(result)           # 200

x = 'abc'
print(eval('x[-1]'))        # c

⭐练习(同上面案例题):

# 练习:添加学生的名字
"""
请输入学生的姓名: 小明
['小明']

请输入学生的姓名: 小花
['小明', '小花']

...
"""
name = input('请输入学生的名字:')
f = open('files/names.txt', encoding='utf-8')
all_stufents = eval(f.read())
f.close()

all_stufents.append(name)
print(all_stufents)

f = open('files/names.txt', 'w', encoding='utf-8')
f.write(str(all_stufents))

你可能感兴趣的:(python,学习,开发语言)