2-1-08 文件操作 - 作业
1.基于csv格式实现 用户的注册 & 登录认证。详细需求如下:
- 用户注册时,新注册用户要写入文件csv文件中,输入Q或q则退出。
- 用户登录时,逐行读取csv文件中的用户信息并进行校验。
- 提示:文件路径须使用os模块构造的绝对路径的方式。
# 1. 文件路径处理
import os
base_dir = os.path.dirname(os.path.abspath(__file__))
db_file_path = os.path.join(base_dir, "file", "bd.csv")
# 用户注册
while True:
choice = input("是否进行用户注册(Y/N):")
choice = choice.upper()
if choice not in {'Y', 'N'}:
print("输入有误,请重新输入")
continue
if choice == "N":
break
#输入正确注册信息
with open(db_file_path,mode='a',encoding='utf-8') as file_object:
user = input("请输入用户名(Q或q则退出):")
if user.upper() == "Q":
break
pwd = input("请输入密码:")
#将内容拼接写入文件中
file_object.write("{},{}\n".format(user,pwd))
#立即将缓存写入内存中
file_object.flush()
break
# 用户登录
print("欢迎使用XX系统,请登录")
username = input("请输入用户名:")
password = input("请输入密码:")
#查看存储用户名和密码的文件是否存在
if not os.path.exists(db_file_path):
print("用户文件不存在")
else:
with open(db_file_path, mode='a', encoding='utf-8') as file_object:
for line in file_object:
user,pwd = line.strip().strip()
if username == user and pwd == password:
print("登录成功")
break
else:
print("登录失败")
2. 补充代码:实现去网上获取指定地区的天气信息,并写入到Excel中。
import requests
while True:
city = input("请输入城市(Q/q退出):")
if city.upper() == "Q":
break
url = "http://ws.webxml.com.cn//WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName={}".format(city)
res = requests.get(url=url)
print(res.text)
# 1.提取XML格式中的数据
# 2.为每个城市创建一个sheet,并将获取的xml格式中的数据写入到excel中。
答案:
import os
import requests
from xml.etree import ElementTree as ET
from openpyxl import workbook
# 文件处理路径
base_dir = os.path.dirname(os.path.abspath(__file__))
target_excel_file_path = os.path.join(base_dir, 'weather.xlsx')
# 创建exc且默认会创建一个sheet(名称为sheet)
wb = workbook.Workbook()
del wb['Sheet']
while True:
city = input("请输入城市(Q/q退出:")
if city.upper() == "Q":
break
url = "http://ws.webxml.com.cn//WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName={}".format(city)
#发送get请求
res = requests.get(url=url)
#获取城市信息
#print(res.text)
#1.提取XML格式中的数据
root = ET.XML(res.text)
#2.为每个城市创建一个sheet,并将获取xml格式中的数据写入到Excel中
sheet = wb.create_sheet(city)
# row_index 维护的行
# node 是xml的内容
for row_index,node in enumerate(root,1):
text = node.text
cell = sheet.cell(row_index,1)
cell.value = text
wb.save(target_excel_file_path)
3. 读取ini文件内容,按照规则写入到Excel中。
ini文件内容如下:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-bin=py-mysql-bin
character-set-server=utf8
collation-server=utf8_general_ci
log-error=/var/log/mysqld.log
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
[client]
default-character-set=utf8
读取ini格式的文件,并创建一个excel文件,且为每个节点创建一个sheet,然后将节点下的键值写入到excel中,按照如下格式。
![[assets/Pasted image 20221015130339.png]]
- 首行,字体白色 & 单元格背景色蓝色。
- 内容均居中。
- 边框。
import os
import configparser
from openpyxl import workbook
from openpyxl.styles import Alignment, Border, Side, Font, PatternFill, GradientFill
# 文件处理路径
bass_dir = os.path.dirname(os.path.abspath(__file__))
fiel_path = os.path.join(bass_dir, 'zy.ini')
target_excel_file_path = os.path.join(bass_dir, 'ini.xlsx')
# 创建Excel且默认会创建一个sheet(名字为sheet)
wb = workbook.Workbook()
del wb['Sheet']
# 解析ini格式文件
config = configparser.ConfigParser()
config.read('./zy.ini', encoding='utf-8')
# 获取每个节点,并为每个节点创建一个sheet
for section in config.sections():
# 在Excel中创建一个sheet,名称为ini文件的节点名称
sheet = wb.create_sheet(section)
# 设置边框和居中(因为表头和内容都要,统一写这里)
# 边框 thin 细的 000000 黑色
side = Side(style="thin", color="000000")
# top 上 bottom 下 left 左 right 右
border = Border(top=side, bottom=side, left=side, right=side)
# 对齐方式:居中 horizontal,水平方向对齐方式 vertical,垂直方向对齐方式
align = Alignment(horizontal='center', vertical='center')
# 在sheet中设置表头
title_dict = {'A1': '键', 'B1': '值'}
for position, text in title_dict.items():
# 找到单元格
cell = sheet[position]
# 设置值
cell.value = text
# 设置居中
cell.alignment = align
# 设置背景颜色 solid 无颜色
cell.fill = PatternFill("solid", fgColor="6495ED")
# 设置字体颜色
cell.font = Font(name="微软雅黑", color="FFFFFF")
# 设置边框
cell.border = border
# 读取此节点下的所有键值,并将键值写入到当前sheet中
# row_index 显示行
row_index = 2
for group in config.items(section):
# group是个元组,group = ("datadir","/var/lib/mysql")
# col表示列
for col, text in enumerate(group, 1):
#找到单元格
cell = sheet.cell(row_index, col)
#设置居中
cell.alignment = align
#设置边框
cell.border = border
#设置值
cell.value = text
row_index += 1
# 写入到Excel表格中
wb.save(target_excel_file_path)
4. 补充代码,实现如下功能。
import requests
# 1.下载文件
file_url = 'https://files.cnblogs.com/files/wupeiqi/HtmlStore.zip'
res = requests.get(url=file_url)
print(res.content)
# 2.将下载的文件保存到当前执行脚本同级目录下 /files/package/ 目录下(且文件名为HtmlStore.zip)
# 3.在将下载下来的文件解压到 /files/html/ 目录下
答案:
import os
import shutil
import requests
# 文件处理路径
bass_dir = os.path.dirname(os.path.abspath(__file__))
download_folder = os.path.join(bass_dir,'files', 'package')
# 判断文件夹是否存在
if not os.path.exists(download_folder):
os.makedirs(download_folder)
# 1.下载文件
file_url = 'https://files.cnblogs.com/files/wupeiqi/HtmlStore.zip'
res = requests.get(url=file_url)
# 2.将下载的文件保存到当前执行脚本同级目录下 /files/package/ 目录下(且文件名为HtmlStore.zip)
# 找到下载的url最后一个HtmlStore.zip字段,也就是压缩包的文件名
file_name = file_url.split('/')[-1]
# 把下载路径和文件名进行拼接
zip_file_path = os.path.join(download_folder,file_name) #.../files/package/HtmlStore.zip
# 把下载的路径写入文件中
with open(zip_file_path,mode='wb') as file_object:
file_object.write(res.content)
# 3.在将下载下来的文件解压到 /files/html/ 目录下
unpack_folder = os.path.join(bass_dir,'files','html')
shutil.unpack_archive(filename=zip_file_path,extract_dir=unpack_folder,format='zip')