os模块
os.system('command')
执行shell命令
# system 调用系统命令
res = os.system("ping www.baidu.com")
print(res)
res = os.system("ipconfig")
print(res)
os.name
输出字符串指示正在使用的平台。如果是window 则用'nt'表示,对于Linux/Unix用户,它是'posix'。
result = os.name
print(result)
os.getcwd()
函数得到当前工作目录(就是你的进程所工作的目录),即当前Python脚本工作的目录路径。
运行目录:执行程序的路径
工作目录:程序运行时,程序中我们要操作的一系列相对路径(相对路径需要参照),以运行时目录为参照。并且可在程序运行时更改
#返回当前工作的路径
result = os.getcwd()
print(result)
os.listdir()
返回指定目录下的所有文件和目录名的一个列表,但是并没有列出来什么是目录,什么是文件。
result = os.listdir("D:\\Languages\\Firststage\\day08")
print(result)
result = os.listdir("../")
print(result)
# py 普通代码文件
# pyc 临时文件,解释
# pyw 图形化文件
os.mkdir('dir_name')
创建单级目录
# 只能创建一层
os.mkdir("../day10000")
os.makedirs('dir_name')
创建多级目录
#os.makedirs('a/b/c')
#递归创建目录
os.makedirs("day12/day13/day14")
# 创建多层
os.mkdir("../day10000/day123")
os.remove('file_name')
删除指定文件
os.remove("../day10000/day123/111.py")
os.rmdir('dir_name')
删除单级空目录
os.rmdir("day10000")
os.removedirs('dir_name')
逐级删除空目录
os.removedirs("../day10000/day123")
os.chdir('file_path')
改变工作目录
result = os.listdir("../")
print(result)
print(os.getcwd())
os.chdir("../day10000")
print(os.getcwd())
os.rename
更改文件名
#rename 先复制原来的文件,然后改名,最后删除原文件
os.rename("../day10000/day123/111.py","../day10000/day123/222.py")
os.walk
'''
os.walk(top, topdown=True, onerror=None, followlinks=False)
top -- 是你所要遍历的目录的地址, 返回的是一个三元组(root,dirs,files)。
root 所指的是当前正在遍历的这个文件夹的本身的地址
dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
topdown --可选,为 True,则优先遍历 top 目录,否则优先遍历 top 的子目录(默认为开启)。如果 topdown 参数为 True,walk 会遍历top文件夹,与top 文件夹中每一个子目录。
onerror -- 可选, 需要一个 callable 对象,当 walk 需要异常时,会调用。
followlinks -- 可选, 如果为 True,则会遍历目录下的快捷方式(linux 下是 symbolic link)实际所指的目录(默认关闭)。
这个函数会返回三个返回值,(dirpath,dirnames,filenames)
dirpath:目录的路径
dirnames:你要查找目录下面所有的目录名
filenames:你要查找目录下面所有的文件名
os.sep 是当前路径分隔符号
我们使用这个os.walk也可以起到遍历一个目录的效果。
'''
result = os.walk("../")
for dirpath,dirname,filename in result:
print(filename)
os.path
os.path.abspath('file_name')
返回file_name的绝对路径
result = os.path.abspath("111.py")
print(result)
os.path.split('file_path')
返回file_path分隔成目录和文件名,并用一个元组返回
result = os.path.split("D:\Languages\Firststage\day08\\1、字典的定义.py")
print(result)
os.path.exists('file_path')
如果file_path存在,则返回True,反之返回False
result = os.path.exists("D:\Languages\Firststage\day08")
print(result)
os.path.join('file_path','file_name')
链接目录与文件名或目录
result = os.path.join("D:\Languages\Firststage","day08")
print(result)
os.path.isdir('name')
判断是否为目录
result = os.path.isdir("../111.py")
print(result)
os.path.isfile('name')
判断是否为文件
result = os.path.isfile("../day10000")
print(result)
os.path.getsize('path')
返回文件大小,如果文件不存在,就返回错误
result = os.path.getsize("D:\Languages\Firststage\day08")
print(result)
文件操作
open()语法
#功能:打开或者创建一个文件
#格式:open('文件路径','打开模式')
# open(file_path,mode)
#返回值:文件io对象
语法 file_object = open(path,method)
path 文件的路径和名称 格式为字符串
-
method 文件打开的权限 格式为字符串
-
w(write) 写权限 如果没有这个文件 自动创建一个 如果有这个文件 那么将会覆盖掉之前的内容。
# 打开文件 f = open("user.txt","w") # 写内容 f.write("this is a test") # 关闭文件 f.close()
-
f = open("user.txt","w",encoding="utf-8")
#write() 向对应的文件中写入文件
f.write("十一假期快乐!")
#close() 关闭文件
f.close()
```
-
a(append) 追加写 如果没有这个文件 自动创建一个 如果有这个文件 那么就在文件末尾进行追加
# 打开文件 f = open("user.txt","a") # 写内容 f.write("this is a test") # 关闭文件 f.close() f = open("user.txt","a",encoding="utf-8") f.write("十一假期快乐!") f.close() f = open("user.txt","a",encoding="utf-8") f.write("十一假期快乐!") # 写操作 是将要写入的内容先写到缓冲区 # 当程序运行结束 自动写入 # 当文件关闭 自动写入 # 当缓冲区被写满 自动写入 # flush()刷新缓冲区 立即写入 f.flush() while True: pass
-
r (read)读操作
f = open("user.txt","r") # 读取文件 保存到变量 content = f.read() print(content,type(content))
f = open("user.txt","r",encoding="utf-8")
# read() 读取全文
content = f.read()
print(content)
#readline() 读一行
contents = f.readline()
print(contents)
#readlines() 以行为单位读取全文
result = f.readlines()
print(result)
f.close()
```
-
w+ 读写
# 如果文件存在 会覆盖之前的内容,不存在就创建 f = open("user.txt","w+") f.write("this is a test") f.seek(0,0) content = f.readlines() print(content) f.close()
f = open("user.txt","w+",encoding="utf-8")
f.write("十一假期快乐!")
f.seek(0,0)
content = f.readlines()
print(content)
f.close()
```
-
a+ 读写
# 如果文件存在 在末尾追加内容,不存在就创建 f = open("user.txt","a+") f.write("this is a test") f.seek(0,0) content = f.readlines() print(content) f.close()
f = open("user.txt","a+",encoding="utf-8")
f.write("十一假期快乐!")
f.seek(0,0)
content = f.readlines()
print(content)
f.close()
```
-
r+ 读写
# 如果文件存在 在从头开始覆盖内容,不存在就报错,不创建新文件 f = open("user.txt","r+") f.write("this is a test") f.seek(0,0) content = f.readlines() print(content) f.close()
f = open("user.txt","r+",encoding="utf-8")
f.write("十一假期快乐!")
f.seek(0,0)
content = f.readlines()
print(content)
f.close()
```
-
wb 二进制替换写入
f = open("user.txt","wb") f.write("wwwpythonorg".encode("utf-8")) f.close() f = open("user.txt","wb") str1 = "大金链子小手表" # encode() 对数据进行指定格式的编码 # f.write("大金链子小手表".encode("utf-8")) f.write(str1.encode("utf-8")) f.close()
-
ab 二进制追加写入
f = open("user.txt","ab") f.write("wwwpythonorg".encode("utf-8")) f.close() f = open("user.txt","ab") str1 = "大金链子小手表" # encode() 对数据进行指定格式的编码 # f.write("大金链子小手表".encode("utf-8")) f.write(str1.encode("utf-8")) f.close()
-
rb二进制读取
f = open("user.txt","rb") # decode() 对数据进行指定格式的解码 content = f.read().decode("utf-8") print(content)
-
seek()调整指针位置
#seek(whence,mode) mode代表参考位置 whence代表偏移量 # mode= 0 以开头为参考位置 3.x版本只能等于0
with open()语法
# with语法不用手动关闭文件,他会自动关闭文件
with open("user.txt","a+") as f:
#此处的文件对象f 是一个局部变量
# tell() 告诉我们当前光标在什么位置
content = f.read()
print(f.tell())
f.seek(10,0)
print(f.tell())
result = f.readline()
print(result)
pickle 模块
"""
1、便于储存 不在存储在内存
2、便于传输 网络传输需要把数据转换为字节流
"""
import pickle
# 操作文件
# dump
# load
# 操作数据
# dumps
# loads
f = open("user.txt","wb")
var = "this is a test"
# 当我们用二进制打开的时候 不再进行编码 而是用Pickle模块直接进行编码
pickle.dump(var,f)
f.close()
f = open("user.txt","rb")
content = pickle.load(f)
# 读取文件的时候 读取出来的内容可以直接用Pickle.load进行解码
print(content)
f.close()
list1 = [1,2,3,4]
res = pickle.dumps(list1)
print(res)
res1 = pickle.loads(res)
print(res1)
练习
注册
'''
用户注册
用户输入一个用户名一个密码
验证用户名是否已经存在
如果存在 重新注册
如果不存在 将注册信息写入文件
'''
#自己的方法
file_1 = open('users.txt', 'a+', encoding='utf-8')
file_1.seek(0,0)
#定义存放用户名,密码的 字典
users_info = {}
#逐行读取用户名,密码,并存储到字典中
for line in file_1.readlines():
users = line.strip().split(',')
#去掉\n 并以,号为切分点
users_info[users[0]]=users[1]
# print(users_info)
#注册
while True:
username = input('请输入用户名:').strip()
password = input('请输入密码:').strip()
rpassword = input('请确认密码:').strip()
if username != "" and " " not in username and password != "" and " " not in password and rpassword != "" and " " not in rpassword :
if username in users_info.keys():
print('用户名已存在,请重新注册')
continue
else:
if password != rpassword:
print('两次输入密码不一致,请重新注册!')
continue
else:
file_1.write(username+','+password + '\n')
print('%s,注册成功!' % username)
break
else:
print('用户名密码不规范')
file_1.close()
#老师讲的
f = open("user.txt","a+")
a = 0
while a == 0:
# 用户输入一个用户名
name = input("请输入一个用户名:")
# 判断用户名不能为空 并且 用户名中不能包含空格
if name != "" and " " not in name:
# 定义一个空列表 用来存储所有的用户名
name_list = []
# 把光标移动到开头位置
f.seek(0,0)
# 读取文件中的所有内容
content = f.readlines()
# 遍历文件中的所有内容
for var in content:
# 切分账号和密码 取出账号
account = var.split(":")[0]
# 把所有且分出来的账号添加到用户列表
name_list.append(account)
# 检测用户名是否被注册
if name not in name_list:
while True:
# 用户输入一个密码
pwd = input("请输入您的密码:")
# 判断密码不能为空 并且 密码中不能包含空格
if pwd != "" and " " not in pwd:
pwd2 = input("请确认您的密码:")
# 判断两次密码是否一致
if pwd == pwd2:
# 如果一致 写入文件
f.write("%s:%s\n"%(name,pwd))
print("注册成功!")
a = 1
break
else:
print("两次密码不一致,请重新输入!")
else:
print("用户名已被占用,请重新注册!")
else:
print("用户名中包含非法字符!")
f.close()
#直接把字典存入文件
import pickle
import os
#先判断有没有存储的文件
if os.path.exists("user.txt"):
f = open("user.txt", "rb")
users_dict = pickle.load(f)
else:
users_dict = {}
a = 0
while a == 0:
# 用户输入一个用户名
name = input("请输入一个用户名:")
# 判断用户名不能为空 并且 用户名中不能包含空格
if name != "" and " " not in name:
if name not in users_dict.keys():
while True:
# 用户输入一个密码
pwd = input("请输入您的密码:")
# 判断密码不能为空 并且 密码中不能包含空格
if pwd != "" and " " not in pwd:
pwd2 = input("请确认您的密码:")
# 判断两次密码是否一致
if pwd == pwd2:
# 如果一致 写入字典
users_dict.setdefault(name,pwd)
print("注册成功!")
f = open("user.txt", "wb")
pickle.dump(users_dict, f)
a = 1
break
else:
print("两次密码不一致,请重新输入!")
else:
print("用户名已被占用,请重新注册!")
else:
print("用户名中包含非法字符!")
f.close()
登录
'''
用户登陆
用户输入一个用户名一个密码
然后和文件里保存的用户名和密码进行匹配
匹配成功则打印登陆成功
匹配失败三次打印账号被锁定
'''
#自己写的
#登录
file_2 = open('users.txt','r')
file_2.seek(0,0)
#定义存放用户名,密码的 字典
users_info={}
#逐行读取用户名,密码,并存储到字典中
for line in file_2.readlines():
users = line.strip().split(',')
users_info[users[0]] = users[1]
file_2.close()
for i in range(3):
username = input('请输入用户名:')
password = input('请输入密码:')
if username != "" and password != "" :
if username in users_info:
pwd = users_info[username]
if password != pwd:
print('密码输入错误')
else:
print('%s,欢迎您!'%username)
break
else:
print('用户名不存在!')
else:
print('用户名密码不允许为空!')
else:
print('账号被锁定')
#老师的方法
f = open("user.txt","r")
# 存放用户名的列表
name_list = []
# 存放密码的列表
pwd_list = []
# 存放黑名单的列表
black_list = []
times = 0
a = 0
while a == 0:
# 用户输入一个用户名
name = input("请输入您的用户名:")
# 读取文件中所有的内容
content = f.readlines()
# 遍历所有的用户信息
for var in content:
# 获取所有的用户名
account = var.split(":")[0]
# 将用户名添加到用户列表
name_list.append(account)
# 获取所有的密码
password = var.split(":")[1][:-1]
# 将所有的密码添加到密码列表
pwd_list.append(password)
# 如果用户输入的用户名在用户列表中
if name in name_list:
# 打开存放黑名单的文件
with open("black_user.txt") as f:
# 获取黑名单文件的内容
content = f.readlines()
# 遍历所有的黑用户
for user in content:
# 将黑用户添加到黑用户列表
black_list.append(user[:-1])
# 判断用户输入的用户名是否存在于黑用户列表
if name not in black_list:
while times < 3:
# 用户输入密码
pwd = input("请输入您的密码:")
# 获取输入的用户名在用户列表中的索引位置
name_index = name_list.index(name)
# 判断密码是否和输入的用户名相匹配
if pwd == pwd_list[name_index]:
print("登陆成功!")
a = 1
break
else:
print("输入密码错误,您还剩%s次机会!"%(2 - times))
times += 1
if times == 3:
print("密码输入三次失败,账户被锁定!")
with open("black_user.txt","a") as f:
f.write(name+"\n")
a = 1
break
else:
print("用户已经被冻结!")
else:
print("用户名不存在!")
f.close()
无人售货
'''
无人售货机
每购买一次
打印一次余额
购买结束之后
打印购买清单
'''
#自己写的
# 创建一个商品列表
goods_list = [["《Python学习手册》",100],["《Python袖珍指南》",30],["《程序员的数学》",50],["《Python从入门到放弃》",1]]
# 创建一个购买列表
buy_list = []
wage = int(input("请输入您的工资:"))
sum_price = 0
if wage > 0:
print("====================================")
print("""
================MHG书店=====================
1、%s:%s RMB
2、%s:%s RMB
3、%s:%s RMB
4、%s:%s RMB
0、退出
============================================
"""
%(
goods_list[0][0],goods_list[0][1],
goods_list[1][0],goods_list[1][1],
goods_list[2][0],goods_list[2][1],
goods_list[3][0],goods_list[3][1]
))
while True:
buy_num = int(input("请输入要购买的图书序号:"))
if buy_num >= 5 :
print("您需要的图书我家没有,请选择其他图书" )
continue
elif buy_num == 0:
print("您本次购买的图书如下:")
# 遍历购买图书的清单
for book,price in buy_list:
print(book,price,"RMB")
sum_price += price
print("您本次共消费 %s RMB,还剩 %s RMB,欢迎下次光临!"%(sum_price,wage))
break
# 判断钱是否足够
elif wage >= goods_list[buy_num-1][1]:
wage -= goods_list[buy_num-1][1]
print("购买 %s 成功,本次消费 %s RMB,还剩 %s RMB"
%(goods_list[buy_num-1][0],goods_list[buy_num-1][1],wage))
buy_list.append(goods_list[buy_num-1])
else:
print("您的余额为 %s RMB,无法购买此图书!"%(wage))
#老师讲的
# 创建一个商品列表
shop_list = [["iphone",5000],["bike",800],["ipad",6000],["computer",8000]]
# 购物列表
buy = []
price = 0
# 用户输入卡内余额
salary = int(input("请输入您的卡内余额:"))
print("====================XDL超市=====================")
# 打印商品列表
# enumerate:获取容器中的索引和索引对应的值
for num,shop in enumerate(shop_list):
print(num+1,shop[0],shop[1])
print("输入0退出")
print("================================================")
# 判断余额大于0
if salary > 0:
while True:
# 用户输入要购买的商品编号
buy_num = int(input("请输入要购买的商品编号:"))
if buy_num == 0:
print("您本次购买的商品如下:")
# 本次消费清单
for shop in buy:
print(shop)
print("您本次共消费%s元,卡内余额为%s元,欢迎下次光临."
%(price,salary))
break
# 判断输入的编号大于0 并且 小于等于商品数量
elif buy_num > 0 and buy_num <= len(shop_list):
# 判断余额是否可以支付要购买的商品
if salary >= shop_list[buy_num-1][1]:
# 购买商品之后的余额
salary -= shop_list[buy_num-1][1]
print("购买%s成功,本次消费%s元,卡内余额%s元."
%(shop_list[buy_num-1][0],shop_list[buy_num-1][1],salary))
# 把购买后的商品 添加到购物列表
buy.append(shop_list[buy_num-1][0])
# 计算消费总额
price += shop_list[buy_num-1][1]
else:
print("您的卡内余额为%s元,无法购买此商品!"%(salary))
else:
print("商品序号有误!")
内建函数enumerate()
#函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
#以下是 enumerate() 方法的语法:enumerate(sequence, [start=0])
#参数
#sequence -- 一个序列、迭代器或其他支持迭代对象。
#start -- 下标起始位置。
#返回值
#返回 enumerate(枚举) 对象。
shop_list = [["iphone",5000],["bike",800],["ipad",6000],["computer",8000]]
for num,shop in enumerate(shop_list):
print(num,shop)
遍历目录下所有py文件
'''
递归遍历目录
给定一个路径
遍历路径下所有的文件
筛选出所有py文件
然后打印出来
'''
#自己写的
#定义一个递归函数用于递归遍历指定目录下的所有文件
import os
def file_directory(path):
# path:遍历指定的路径
for file in os.listdir(path):
#将文件路径连接起来
fill_path = os.path.join(path, file)
# 判断是不是目录
if os.path.isdir(os.path.join(path,file)):
file_directory(os.path.join(path,file))
else:
# 判断是不是py文件
if fill_path[-2:] == "py":
print(file)
else:
pass
for i in range(1,4) :
# 打印当前绝对路径
input_path = input("请输入目录:")
if os.path.isdir(input_path):
absolute_path = os.path.abspath(input_path)
print(absolute_path)
# 调用递归函数
file_directory(absolute_path)
break
else:
print("输入有误,您还有 %s 次机会!"%(3-i))
#老师讲的
import os
# 给定一个要遍历的路径
FILE_PATH = "D:\兄弟连\python14期\代码\day2"
def getfile(dirpath):
# 获取指定路径下的所有文件和目录
file = os.listdir(dirpath)
# 遍历所有的文件和目录
for var in file:
# 拼接路径和文件
file_path = os.path.join(dirpath,var)
# 判断是否是一个文件 并且 这个文件以.py结尾
if os.path.isfile(file_path) and file_path.endswith(".py"):
print(file_path)
# 判断是一个文件 但是 不是以.py结尾的文件
elif os.path.isfile(file_path) and not file_path.endswith(".py"):
pass
else:
# 如果是一个目录 那么就继续做同样的事情
getfile(file_path)
getfile(FILE_PATH)