删除文件和文件夹
import shutil
import os
from pathlib import Path
# 第一种:删除一个文件夹,无论里面是否有文件或文件夹
# (不支持文件,文件夹不存在会报错)
def del_files0(dir_path):
shutil.rmtree(dir_path)
# 第二种 递归删除dir_path目标文件夹下所有文件,以及各级子文件夹下文件,保留各级空文件夹
# (支持文件,文件夹不存在不报错)
def del_files(dir_path):
if os.path.isfile(dir_path):
try:
os.remove(dir_path) # 这个可以删除单个文件,不能删除文件夹
except BaseException as e:
print(e)
elif os.path.isdir(dir_path):
file_lis = os.listdir(dir_path)
for file_name in file_lis:
# if file_name != 'wibot.log':
tf = os.path.join(dir_path, file_name)
del_files(tf)
print('ok')
# 第三种: 删除dir_path目标文件夹下所有内容,保留dir_path文件夹
# (不支持文件,文件夹不存在会报错)
def del_files2(dir_path):
# os.walk会得到dir_path下各个后代文件夹和其中的文件的三元组列表,顺序自内而外排列,
# 如 log下有111文件夹,111下有222文件夹:[('D:\\log\\111\\222', [], ['22.py']), ('D:\\log\\111', ['222'], ['11.py']), ('D:\\log', ['111'], ['00.py'])]
for root, dirs, files in os.walk(dir_path, topdown=False):
print(root) # 各级文件夹绝对路径
print(dirs) # root下一级文件夹名称列表,如 ['文件夹1','文件夹2']
print(files) # root下文件名列表,如 ['文件1','文件2']
# 第一步:删除文件
for name in files:
os.remove(os.path.join(root, name)) # 删除文件
# 第二步:删除空文件夹
for name in dirs:
os.rmdir(os.path.join(root, name)) # 删除一个空目录
# 如果存在目录则删除,并创建新文件夹
if os.path.exists(path):
shutil.rmtree(path, True)
os.mkdir(path)
if __name__ == '__main__':
dir_path = Path('./log').absolute()
del_files2(dir_path)
打印当前目录
os.getcwd()
# >>>''D:\\workspace\\爬虫文档整理\\08-软件谷oceanspider\\oceanspider'
os.path.abspath(os.curdir)
# >>>''D:\\workspace\\爬虫文档整理\\08-软件谷oceanspider\\oceanspider'
os.path.abspath('.')
# >>>''D:\\workspace\\爬虫文档整理\\08-软件谷oceanspider\\oceanspider'
sys.path[0]
# >>>''D:\\SoftwarePlace\\JetBrains\\PyCharm 2021.2.1\\plugins\\python\\helpers\\pydev'
sys.argv[0]
# >>>''D:\\SoftwarePlace\\JetBrains\\PyCharm 2021.2.1\\plugins\\python\\helpers\\pydev\\pydevconsole.py'
sys.argv
# >>>'['D:\\SoftwarePlace\\JetBrains\\PyCharm 2021.2.1\\plugins\\python\\helpers\\pydev\\pydevconsole.py', '--mode=client', '--port=55166']
sys.path
windows路径问题
windows 中路径使用反斜线,linux下路径使用’/’, windows下的路径在linux下是不能被识别的。
path = os.path.split(os.path.realpath(file))[0] + r’\cmds’
这样的路径不会被linux所识别
解决方案
-
使用
os.path.joinpath = os.path.join(os.path.split(os.path.realpath(__file__))[0], 'cmds') -
使用
os.sep, python会根据不同的系统自动选择合适的路径分隔path = os.path.split(os.path.realpath(__file__))[0] + os.sep + 'cmds' -
可以将所有的路径都使用正斜线:’/’, 在windows和linux都有效
path = path.replace('\\', '/') -
使用最新的
pathlib模块import pathlib pathlib.Path('C:\dir', 'cmds') # WindowsPath('C:/dir/cmds')
气象预警项目示例
# -*- coding: UTF-8 -*-
"""=========================================================
@Project -> File: WeatherInfoSpider -> upload
@IDE: PyCharm
@author: lxc
@date: 2022/8/30 下午 3:07
@Desc:
1-功能描述:
上传五分钟内的数据至FTP位置
2-实现步骤
1-读取表数据
2-生成xlsx
3-上传至ftp
"""
import os
import datetime
from openpyxl import Workbook
from utils.pipeline_mysql import ItemToMysql
from config.config import TABLE_NAME
from utils.log_template import Logger
from utils.ftp_upload import MyFTP
from config.config import LOGGING
logger = Logger(LOGGING).get_logger('upload')
def get_last_items(before_timestamp):
conn, cursor = ItemToMysql(table_name=TABLE_NAME).connectMysql()
sql = """SELECT * FROM {0} WHERE release_time > '{1}' ORDER BY release_time DESC""".format(TABLE_NAME,
before_timestamp)
try:
cursor.execute(sql)
result = cursor.fetchall()
except Exception as err:
result = []
logger.exception(err)
finally:
conn.close()
cursor.close()
return result
def run(minutes=-5):
# minutes分钟之前的时间
before_timestamp = (datetime.datetime.now() + datetime.timedelta(minutes=minutes)).strftime("%Y-%m-%d %H:%M:%S")
# 获取该时间点之后的数据
items = get_last_items(before_timestamp)
if not items:
logger.info("五分钟内无数据更新,退出!")
return
else:
logger.info("五分钟内有数据更新,开始!")
to_excel(items)
def to_excel(items):
"""
将数据导出到excel
:return:
"""
logger.info("准备导出Excel...")
fields = list(items[0].keys())
# 实例化
wb = Workbook()
# 创建表(sheet)
sheet = wb.worksheets[0]
# 写入标题
row = 1
for col, field in enumerate(fields):
sheet.cell(row=row, column=col + 1, value=field)
# 写入数据
length = len(items)
for data in items:
for col, field in enumerate(data):
try:
cell_message = data[field]
cell = sheet.cell(row + 1, col + 1, cell_message)
if str(cell_message).startswith('='):
cell.number_format = 'General'
cell.data_type = 's'
except Exception as e:
sheet.cell(row + 1, col + 1, '')
logger.error(e)
logger.info("表{0}".format(TABLE_NAME) + "导出进度:%.2f" % (row * 100 / length) + "%")
row += 1
# 保存数据
file_name = "WeatherInfo-{}.xlsx".format(datetime.datetime.now().strftime("%Y-%m-%d %H.%M.%S"))
tree_path = os.getcwd() + os.sep + 'TemporaryFiles'
# 如果不存在目录,则创建临时文件夹
if not os.path.exists(os.getcwd() + os.sep + 'TemporaryFiles'):
os.mkdir(tree_path)
client_path = tree_path + os.sep + file_name
logger.info("正在保存至{} ...".format(client_path))
# 将数据保存至临时文件夹中
wb.save(client_path)
# 上传ftp
server_path = "/data/data01/ftp/nanshui_weather_info/" + file_name
upload(client_path, server_path)
os.remove(client_path)
logger.info("{}:保存完毕".format(file_name))
def upload(client_path, server_path):
my_ftp = MyFTP()
my_ftp.login("ftp", "Ftp!@#9ijn4rfv")
# 上传单个文件
my_ftp.upload_file(client_path, server_path)
my_ftp.close()
if __name__ == '__main__':
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
os.chdir(BASE_DIR)
run(-30)