day13-包和文件操作

本文详细介绍了Python中导入模块的原理,包括只执行一次的特性以及如何避免重复执行。同时,讲解了包的使用,包括包的定义、导入方式及`__init__.py`的作用。此外,文章还深入探讨了文件操作,如数据持久化的重要性、文件的读写模式、文件操作步骤,并提供了实例代码。最后,提到了eval函数在字符串与数据转换中的应用。
摘要由CSDN通过智能技术生成

导入模块的原理

1. 导入原理

当代码执行到导入模块的时候,系统会自动进入指定模块,将模块中的代码全部执行一遍;
如果在同一个程序中,同一个模块导入多次,对应的代码只会执行一次。

# import test
# import test
# from test import a

# from test import sum_yt
# print(f'1+2+3+...+10:{sum_yt(10)}')

from test import download
download('肖申克的救赎')

2. 导入模块的时候选择可执行的代码

在if外面的代码会被别的模块执行

if __name__ == '__main__'
	# 在if里面的代码不会被别的模块执行
	pass

包的使用

1. 什么是包

包含__init__.py文件的文件夹就是包
包名 - 文件夹的名字(必须符号要求:是标识符、不是关键字)

2. 怎么使用包中的模块中的内容 - 怎么导

1) import 包名 - 直接导入包(这种导入方式在没有定制__init__.py文件的时候没有意义)
2) from 包名 import 模块名1, 模块名2,…
3) import 包名.模块名
import 包名.模块名 as 新名字
4) from 包名.模块名 import 变量名1, 变量名2,…

3. init.py的使用

import 包名 - 通过包名可以使用的是__init__.py里面的内容

文件操作

1. 数据持久化

计算的存储空间分为两种: 运行内存、硬盘

  1. 存储在运行内存的数据的特点:运行程序的时候存储,程序运行结束自动销毁。
    (运行内存中的数据最多活一个应用程序的一个生命周期,一个数据存储后在下一次运行程序的时候无法使用)
    程序中使用的数据默认都是存储在运行内存中。

  2. 存储在硬盘中的数据的特点:一直存在,直到人为删除或者硬盘损坏。-- 持久
    数据持久化 - 就将数据以文件的形式存储到硬盘中。
    如果程序运行过程中产生的数据在下一次运行程序的时候还可以用,那么这个数据就需要持久化

2. 常见持久化工具 - 文件

数据库(.db、.sqlite)、excel文件、csv文件、json文件、plist文件、css文件、qss文件等

3.文件操作 - 操作文件内容

文件操作步骤:打开文件 -> 操作文件(读、写) -> 关闭文件

3.1 打开文件

open(file, mode=‘r’, *,encoding=None) - 以指定的方式打开指定文件返回一个文件对象
1) 参数file - 决定打开哪个文件
file - 字符串;需要打开的文件的路径(路径分为绝对路径和相对路径两种)
绝对路径:文件在计算机中的全路径(位置),比如:window,路径从盘开始
相对路径:只有当需要打开的文件在工程目录下的时候才能使用相对路径
用 . 表示当前目录(当前目录指的是当前写代码的文件所在的目录)
用 . . 表示当前目录的上层目录
绝对路径
open(r’/Users/yuting/lessons/Python2106(2)/代码/01语言基础/day13-包和文件操作/files/student.txt’)

使用 . 的相对路径
open(’./files/student.txt’)
open(‘files/student.txt’) # 相对路径开头./可以省略

使用 . . 的相对路径
open(’…/day13-包和文件操作/files/student.txt’)

2) 参数mode - 确定打开方式
mode的值决定:1.打开文件后能干什么(能读还是能写) 2.操作文件的时候数据的类型(字符串、二进制)
mode的值由两组值组成:
第一组值:能读还是能写
r - 只读
w - 只写;会清空原文件
a - 只写;会保留原文件内容,追加
注意:以读的方式打开不存在的文件程序会报错,以写方式打开不存在的文件不会报错,并且会自动创建这个文件
第二组值:数据类型是字符串还是二进制(默认是t)
t - 字符串(str)
b - 二进制(bytes)
注意:打开文本文件用t,打开非文本文件只能用b

3) 参数encoding - 文本文件编码方式
文件创建的时候采用的是什么编码方式,打开的时候就用那种方式。
utf-8、gbk

注意:如果以b的方式打开文件,不能给encoding赋值

# r - 只读
# f = open('./files/student.txt', 'r')
# f.read()
# # f.write('abc')        # io.UnsupportedOperation: not writable
# w - 清空原文件;只写
# f = open('./files/student.txt', 'w')
# f.write('abc')
# # f.read()      # io.UnsupportedOperation: not readable
# a - 不清空;只写
# f = open('./files/student.txt', 'a')
# f.write('abc')
# # f.read()      # io.UnsupportedOperation: not readable
# r - 文件不存在报错
# open('./files/电影3.txt', 'r')    # FileNotFoundError: [Errno 2] No such file or directory: './files/电影.txt'

# a、w - 文件不存在不会报错,并且新建文件
# open('./files/电影.txt', 'w')
# open('./files/电影2.txt', 'a')

# t - 数据类型是字符串; b - 二进制数据类型
# f = open('./files/student.txt', 'rt')
# result = f.read()
# print(type(result))     # <class 'str'>

# f = open('./files/student.txt', 'rb')
# result = f.read()
# print(type(result))     # <class 'bytes'>


# f = open('./files/student.txt', 'at')
# f.write('abc')

# f = open('./files/student.txt', 'ab')
# f.write(b'abc')

print(type('abc'), type(b'abc'))

补充:二进制和字符串的相互转换

# 字符串转二进制
name = '小明'
result = bytes(name, encoding='utf-8')
print(result, type(result))

result = name.encode()
print(result, type(result))

# 二进制转字符串
message = b'abc'
result = str(message, encoding='utf-8')
print(result, type(result))

result = message.decode()
print(result, type(result))

# 二进制文件(图片、视频、音频、pdf)只能用b打开
f = open('files/0.jpg', 'rb')
f.read()

文件读写和关闭

1. 读文件

文件对象.read() - 从读写位置开始,读到文件结尾(获取整个文件中的内容)
文件对象.readline() - 读一行(只能针对文本文件有效)

f = open('files/student.txt')
result = f.read()
print(result)

print('--------------------------------')
# f = open('files/student.txt')
f.seek(0)           # 将读写位置移动到文件开头
result = f.read()
print(result)

2.写操作

文件对象.write(数据) - 将数据写入文件中
f = open(‘files/student.txt’, ‘a’)
f.write(’\nhello world!’)

3.关闭文件

文件对象.close()
f.close()
#f.write(’\n23js’)

数据持久

1.怎么做到数据持久化

第一步:确定需要持久化的数据是什么
第二步:创建文件保存需要持久化的数据,并且确定文件内容的初始值
第三步:在程序中需要这个数据的时候,从文件中读数据出来
第四步:当这个数据发生改变,必须将最新的数据写入到文件中

练习: 写一个程序,打印程序执行的次数

# 确定需要持久化的数据是什么: 次数
# 获取上一次的次数
f = open('files/count.txt')
count = int(f.read())
f.close()

# 次数加1再打印
count += 1
print(count)

# 将最新的次数写入文件
f = open('files/count.txt', 'w')
f.write(str(count))
f.close()

练习:写一个账号注册的功能,注册成功后打印当前系统已经注册过的所有的账号和对应的密码
输入账号:abc
输入密码:123456
abc 123456

输入账号:小明
输入密码:abc123
abc 123456
小明 abc123

# # 需要持久化的数据:所有注册过的账号和密码
# username = input('请输入账号:')
# password = input('请输入密码:')
#
# # 将新注册的账号添加到文件中
# open('files/users.txt', 'a').write(f'{username} {password}\n')
#
# # 读出所有注册过的账号和密码
# all_user = open('files/users.txt').read()
# print(all_user)

补充:特别好用的一个系统函数:eval
str(数据) - 将数据转换成字符串
eval(字符串) - 去掉字符串引号,获取引号中表达式的值

result = eval('100')      # 100
result = eval('12.5')     # 12.5
result = eval('[10, 20, 30]')       # [10, 20, 30]
print(result, type(result))
result = eval('{"a": 10, "b": 20}')     # {'a': 10, 'b': 20}

result = eval('10 + 20')        # 30  -> 10 + 20
print(result)

a = 100
result = eval('a * 2')   # 200   -> a * 2
print(result)

b = [10, 20, 30]
result = eval('b[-1]')     # b[-1]   -> 30
print(result)

# result = eval('abc')        # abc
# print(result)     # 报错!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值