Python学习笔记--day09 函数& 模块 (文件、路径操作)
时间:2022-09-11 18:30:00
第二模块 函数&模块
第一个模块主要是学习python工作中的实际问题可以从第二模块开始解决。
-
函数,一个用于实现某一功能的代码块(可重用)。
-
内置函数
len、bin、oct、heX等
-
自定义函数
def send_email(): # 写10行代码,发邮件。 pass send_email()
# 功能代码块定义了函数 def send_email(): # 写10行代码,发邮件。 pass goods = [ { "name": "电脑", "price": 1999}, { "name": "鼠标", "price": 10}, { "name": "游艇", "price": 20}, { "name": "美女", "price": 998} ] for index in range(len(goods)): item = goods[index] print(index 1, item['name'], item['price']) # 调用和执行函数 send_email() while True: num = input("请输入要选择的商品序列号(Q/q):") # "1" if num.upper() == "Q": break if not num.isdecimal(): print("用输入的格式错误") break num = int(num) send_email() if num > 4 or num < 0: print("范围选择错误") break target_index = num - 1 choice_item = goods[target_index] print(choice_item["name"], choice_item['price']) send_email()
-
-
模块,集成了很多功能的函数集合。
-
内置模块,Python内部帮助我们提供好的。
import random num = random.randint(0,19)
import decimal v1 = decimal.Decimal("0.1") v2 = decimal.Decimal("0.2") v3 = v1 + v2 print(v3) # 0.3
-
第三方模块,网上下载别人写好的模块(功能集合)。
-
自定义模块
-
day09 文件操作相关
- 文件操作
- 文件夹和路径
- csv格式文件
- ini格式文件
- xml格式文件
- excel文件
- 压缩文件
1. 文件操作
在学习文件操作之前,先来回顾一下编码的相关以及先关数据类型的知识。
-
字符串类型(str),在程序中用于表示文字信息,本质上是unicode编码中的二进制。
name = "刘小伟"
-
字节类型(bytes)
-
可表示文字信息,本质上是utf-8/gbk等编码的二进制(对unicode进行压缩,方便文件存储和网络传输。)
name = "刘小伟" data = name.encode('utf-8') print(data) # b'\xe5\x88\x98\xe5\xb0\x8f\xe4\xbc\x9f' result = data.decode('utf-8') print(result) # "刘小伟"
-
可表示原始二进制(图片、文件等信息)
-
1.1 读文件
-
读文本文件
# 1.打开文件 # - 路径: # 相对路径:'info.txt' # 绝对路径:'/Users/liuxiaowei/PycharmProjects/路飞全栈/day09/files/info.txt' # - 模式 # rb,表示读取文件原始的二进制(r, 读 read;b, 二进制 binary;) # 1.打开文件 file_object = open('files/info.txt', mode='rb') # 2.读取文件内容,并赋值给data data = file_object.read() # 3.关闭文件 file_object.close() print(data) # b'alex-123\n\xe6\xad\xa6\xe6\xb2\x9b\xe9\xbd\x90-123' text = data.decode("utf-8") print(text)
# 1.打开文件 file_object = open('files/info.txt', mode='rt', encoding='utf-8') # 2.读取文件内容,并赋值给data data = file_object.read() # 3.关闭文件 file_object.close() print(data)
-
读图片等非文本内容文件。
file_object = open('files/美女.png', mode='rb') data = file_object.read() file_object.close() print(data) # \x91\xf6\xf2\x83\x8aQFfv\x8b7\xcc\xed\xc3}\x7fT\x9d{.3.\xf1{\xe8\...
注意事项:
-
路径
-
相对路径,你的程序到底在哪里运行的?
-
绝对路径
# 1.打开文件 file_object = open('/Users/liuxiaowei/PycharmProjects/路飞全栈/day09/files/info.txt', mode='rt', encoding='utf-8') # 2.读取文件内容,并赋值给data data = file_object.read() # 3.关闭文件 file_object.close()
windows系统中写绝对路径容易出问题:
# file_object = open('C:\\new\\info.txt', mode='rt', encoding='utf-8') file_object = open(r'C:\new\info.txt', mode='rt', encoding='utf-8') data = file_object.read() file_object.close() print(data)
-
-
读文件时,文件不存在程序会报错
Traceback (most recent call last): File "/Users/liuxiaowei/PycharmProjects/路飞全栈/day09/2.读文件.py", line 2, in <module> file_object = open('infower.txt', mode='rt', encoding='utf-8') FileNotFoundError: [Errno 2] No such file or directory: 'infower.txt'
# 判断路径是否存在? import os file_path = "/Users/liuxiaowei/PycharmProjects/路飞全栈/day09/files/info.txt" exists = os.path.exists(file_path) if exists: # 1.打开文件 file_object = open('files/info.txt', mode='rt', encoding='utf-8') # 2.读取文件内容,并赋值给data data = file_object.read() # 3.关闭文件 file_object.close() print(data) else: print("文件不存在")
1.2 写文件
-
写文本文件
# 1.打开文件 # 路径:t1.txt # 模式:wb(要求写入的内容需要是字节类型) file_object = open("files/t1.txt", mode='wb') # 2.写入内容 file_object.write( "刘小伟".encode("utf-8") ) # 3.文件关闭 file_object.close()
file_object = open("files/t1.txt", mode='wt', encoding='utf-8') file_object.write("刘小伟") file_object.close()
-
写图片等文件
f1 = open('files/a1.png',mode='rb') content = f1.read() f1.close() f2 = open('a2.png',mode='wb') f2.write(content) f2.close()
基础案例
# 案例1:用户注册
user = input("请输入用户名:")
pwd = input("请输入密码:")
data = f"{
usre}-{
pwd}"
file_object = open("files/info.txt", mode='wt', encoding='utf-8')
file_object.write(data)
file_object.close()
""" # 案例2:多用户注册 """
# w写入文件,先清空文件;再在文件中写入内容。
file_object = open("files/info.txt", mode='wt', encoding='utf-8')
while True:
user = input("请输入用户名:")
if user.upper() == "Q":
break
pwd = input("请输入密码:")
data = f"{
user}-{
pwd}\n"
file_object.write(data)
file_object.close()
小高级案例:(超前)
利用Python想某个网址发送请求并获取结果(利用第三方的模块)
- 下载第三方模块
pip install requests
/Library/Frameworks/Python.framework/Versions/3.9/bin/pip3 install requests
- 使用第三方模块
import requests res = requests.get(url="网址") print(res)
# 案例1:去网上下载一点文本,文本信息写入文件。
import requests
res = requests.get(
url="https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=20",
headers={
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
}
)
# 网络传输的原始二进制信息(bytes)
# res.content
file_object = open('files/log1.txt', mode='wb')
file_object.write(res.content)
file_object.close()
# 案例2:去网上下载一张图片,图片写入本地文件。
import requests
res = requests.get(
url="https://hbimg.huabanimg.com/c7e1461e4b15735fbe625c4dc85bd19904d96daf6de9fb-tosv1r_fw1200",
headers={
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
}
)
# 网络传输的原始二进制信息(bytes)
# res.content
file_object = open('files/美女.png', mode='wb')
file_object.write(res.content)
file_object.close()
注意事项:
- 路径
- 绝对路径
- 相对路径
- 文件不存在时,w模式会新建然后再写入内容;文件存在时,w模式会清空文件再写入内容。
1.3 文件打开模式
上文我们基于文件操作基本实现了读、写的功能,其中涉及的文件操作模式:rt、rb、wt、wb,其实在文件操作中还有其他的很多模式。
========= ===============================================================
Character Meaning
--------- ---------------------------------------------------------------
'r' open for reading (default)
'w' open for writing, truncating the file first
'x' create a new file and open it for writing
'a' open for writing, appending to the end of the file if it exists
'b' binary mode
't' text mode (default)
'+' open a disk file for updating (reading and writing)
The default mode is 'rt' (open for reading text).
关于文件的打开模式常见应用有:
-
只读:
r
、rt
、rb
(用)- 存在,读
- 不存在,报错
-
只写:
w
、wt
、wb
(用)- 存在,清空再写
- 不存在,创建再写
-
只写:
x
、xt
、xb
- 存在,报错
- 不存在,创建再写。
-
只写:
a
、at
、ab
【尾部追加】(用)- 存在,尾部追加。
- 不存在,创建再写。
-
读写
-
r+、rt+、rb+,默认光标位置:起始位置
file_object = open('files/info.txt', mode='rt+') # 读取内容 data = file_object.read() print(data) # 写入内容 file_object.write("你好呀") file_object.close()
file_object = open('files/info.txt', mode='rt+') # 写入内容 file_object.write("alex") # 读取内容 data = file_object.read() print(data) # -123 file_object.close()
-
w+、wt+、wb+,默认光标位置:起始位置(清空文件)
# 读取内容 data = file_object.read() print(data) # 写入内容 file_object.write("你好呀") # 将光标位置重置起始 file_object.seek(0) # 读取内容 data = file_object.read() print(data) file_object.close()
-
x+、xt+、xb+,默认光标位置:起始位置(新文件)
-
a+、at+、ab+,默认光标位置:末尾
file_object = open('files/info.txt', mode='at+') # 写入内容 file_object.write("武沛齐") # 将光标位置重置起始 file_object.seek(0) # 读取内容 data = file_object.read() print(data) file_object.close()
-
多用户注册案例
while True:
user = input("用户名:")
if user.upper() == "Q":
break
pwd = input("密码:")
data = "{}-{}\n".format(user, pwd)
file_object = open('files/account.txt', mode='a')
file_object.write(data)
file_object.close()
file_object = open('files/account.txt', mode='a')
while True:
user = input("用户名:")
if user.upper() == "Q":
break
pwd = input("密码:")
data = "{}-{}\n".format(user, pwd)
file_object.write(data)
file_object.close()
1.4 常见功能
在上述对文件的操作中,我们只使用了write和read来对文件进行读写,其实在文件操作中还有很多其他的功能来辅助实现更好的读写文件的内容。
-
read,读
-
读所有【常用】
f = open('info.txt', mode='r',encoding='utf-8') data = f.read() f.close()
f = open('info.txt', mode='rb') data = f.read() f.close()
-
读n个字符(字节)【会用到】
f = open('info.txt', mode='r', encoding='utf-8') # 读1个字符 data = f.read(1) f.close() print(data) # 刘
f = open('info.txt', mode='r',encoding='utf-8') # 读1个字符 chunk1 = f.read(1) chunk2 = f.read(2) print(chunk1,chunk2) f.close()
f = open('info.txt', mode='rb') # 读1个字节 data = f.read(3) f.close() print(data, type(data)) # b'\xe6\xad\xa6'
-
-
readline,读一行
f = open('info.txt', mode='r', encoding='utf-8') v1 = f.readline() print(v1) v2 = f.readline() print(v2) f.close()
f = open('info.txt', mode='r', encoding='utf-8') v1 = f.readline() print(v1) f.close() f = open('info.txt', mode='r', encoding='utf-8') v2 = f.readline() print(v2) f.close()
-
readlines,读所有行,每行作为列表的一个元素
f = open('info.txt', mode='rb') data_list = f.readlines() f.close() print(data_list)
-
循环,读大文件(readline加强版)【常见】
f = open('info.txt', mode='r', encoding='utf-8') for line in f: print(line.strip()) f.close()
-
write,写
f = open('info.txt', mode='a',encoding='utf-8') f.write("刘小伟") f.close()
f = open('info.txt', mode='ab') f.write( "刘小伟".encode("utf-8") ) f.close()
-
flush,刷到硬盘
f = open('info.txt', mode='a',encoding='utf-8') while True: # 不是写到了硬盘,而是写在缓冲区,系统会将缓冲区的内容刷到硬盘。 f.write("刘小伟") f.flush() f.close()
file_object = open('files/account.txt', mode='a') while True: user = input("用户名:") if user.upper() == "Q": break pwd = input("密码:") data = "{}-{}\n".format(user, pwd) file_object.write(data) file_object.flush() file_object.close()
-
移动光标位置(字节)
f = open('info.txt', mode='r+', encoding='utf-8') # r+ 读写 # 移动到指定字节的位置 f.seek(3) f.write("刘小伟") f.close()
注意:在a模式下,调用write在文件中写入内容时,永远只能将内容写入到尾部,不会写到光标的位置。
f = open('files/info.txt', mode = 'r+', encoding='utf-8') f.seek(2) f.write('李小龙') # 先将光标移动到最后,再写数据, 可能出现乱码, 因为"utf-8"编码3个字节一个汉字,seek(2),移动 # 第一个汉字的第2个字节 f.close()
-
获取当前光标位置
# 读字符 f = open('info.txt', mode='r', encoding='utf-8') p1 = f.tell() print(p1) # 0 f.read(3) # 读3个中文字符 3*3=9字节 , 如果是英文字符,那么p2是3,因为每个英文字符一个字节 p2 = f.tell() print(p2) # 9 f.close()
# 读字节 f = open('info.txt', mode='rb') p1 = f.tell() print(p1)