1.采用os模块及os.path模块,完成输出一个指定路劲下所有的文件,当碰见文件时打印文件名称,当碰见目录时,则进入目录使用递归完成
解题思路:
-
起始路径和基本条件:
- 首先,确定要搜索的起始路径,这是搜索开始的地方。
- 我们需要考虑如何处理空路径或不存在的路径的情况。
-
遍历目录:
- 使用
os.listdir()
函数列出指定路径下的所有项目(文件和子目录)。 - 对于每个项目,我们需要判断它是一个文件还是一个目录。
- 使用
-
处理文件:
- 如果遍历到的项目是一个文件(通过
os.path.isfile()
判断),则输出该文件的名称。 - 这是递归的基本情况,因为文件是搜索的终点。
- 如果遍历到的项目是一个文件(通过
-
处理目录:
- 如果遍历到的项目是一个目录(即不是文件),则需要进入这个目录继续搜索。
- 这里使用了递归的方法,即调用自身
search()
函数来处理子目录。 - 进入子目录后,重复上述步骤,继续遍历该子目录下的所有项目。
-
递归调用:
- 通过递归调用
search()
函数,可以深入地遍历目录结构,直到所有文件都被找到并输出它们的名称。
- 通过递归调用
-
终止条件:
- 递归的终止条件是遇到文件(输出文件名),而不再进入子目录。
- 递归调用确保了在搜索过程中每一层目录都能被处理,直到搜索完整个目录结构。
实现代码:
import os
def search(path_init):
for item in os.listdir(path_init):
item_path = os.path.join(path_init, item)
if os.path.isfile(item_path):
print(item)
else:
search(item_path)
def main():
path_init = "C:\\Users\\25874\\Desktop\\PythonCodes"
search(path_init)
if __name__ == "__main__":
main()
2.用户输入一个字符串,统计字符串中各字符出现的次数,并将结果写入本地文件
解题思路:
- 接收输入:获取用户输入的字符串。
- 统计字符出现次数:编写函数来统计输入字符串中每个字符出现的次数,并将结果存储在字典中。
- 打开文件:使用文件操作打开一个目标文件,准备将结果写入其中。
- 写入结果:遍历统计结果字典,并将字符及其出现次数以指定格式写入文件中。
- 文件写入方式:需要注意选择适当的文件写入方式,确保不会丢失之前的文件内容。
实现代码:
def count_str(input_str):
count_dict = {}
for s in input_str:
if s in count_dict:
count_dict[s] += 1
else:
count_dict[s] = 1
return count_dict
def main():
input_str = input()
result = count_str(input_str)
f = open("C:\\Users\\25874\\Desktop\\PythonCodes\\python_io\\testio1.text", "r+")
for items in result.items():
f.write(f"{items[0]}:{items[1]} ")
if __name__ == "__main__":
main()
3.给定一个包含n+1个整数的数组nums,其数字在1到n之间(包含1和n),可知至少存在一个重复的整数 假设只有一个重复的整数,请找出这个重复的数,如[1,2,3,3,4],输出3
解题思路:
- 生成随机数组:首先,从用户输入中获取一个整数 n,然后生成一个包含 n 个随机整数的列表。
- 统计数字出现次数:接着,定义了一个函数
searchSame()
,用于统计列表中各个数字出现的次数,存储在字典中。 - 遍历统计结果:在
main()
函数中,遍历统计结果字典,如果某个数字出现次数大于 1,则打印该数字,这就是重复的数字。
实现代码:
import random
def searchSame(random_list):
count_dict = {}
for num in random_list:
count_dict[num] = count_dict.get(num, 0) + 1
return count_dict
def main():
n = int(input("请输入n值:"))
random_list = []
for i in range(n):
random_list.append(random.randint(1, n))
result = searchSame(random_list)
print(random_list)
for k in result:
if result[k] > 1:
print(k)
if __name__ == "__main__":
main()
4.编写控制台登录系统,假设已加密的账号密码存储在本地文件中,文件名为userinfo.text,用户输入账户名及密码,并验证登录,提示是否登录成功
解题思路:
用户信息以用户名和密码的形式保存在一个文件中。当用户尝试登录时,系统会要求输入用户名和密码。接着,系统会从文件中读取存储的用户名和对应的密码。密码被哈希加密过,这样即使用户信息被泄露,也无法直接获知密码。在验证用户名和密码时,系统将用户输入的密码与存储的哈希加密后的密码进行比对,如果匹配成功,则认为登录成功。此外,为了增加密码的复杂度,还引入了盐值的概念,将盐值与密码拼接后再进行哈希加密。这样即使两个用户使用相同的密码,其哈希值也会不同,增加了破解的难度。
账号密码存储格式:
实现代码:
import hashlib
def is_login(username, password, salt):
hashed_username = hashlib.md5((username + salt).encode()).hexdigest()
hashed_password = hashlib.md5((password + salt).encode()).hexdigest()
# 从文件中读取加密后的用户名和密码
with open("C:\\Users\\25874\\Desktop\\PythonCodes\\python_practice\\userinfo.text", "r") as f:
for line in f:
stored_username, stored_password = line.strip().split(":")
# 比较输入的用户名和密码与文件中的是否匹配
if stored_username == hashed_username and stored_password == hashed_password:
return "登录成功"
return "登录失败"
def main():
username = input("请输入用户名:")
password = input("请输入密码:")
salt = input("请输入盐值:")
print(is_login(username, password, salt))
if __name__ == "__main__":
main()