python文件及路径
python文件及路径

python文件及路径

删除文件和文件夹

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所识别
解决方案

  1. 使用os.path.join

    path = os.path.join(os.path.split(os.path.realpath(__file__))[0], 'cmds')
  2. 使用os.sep, python会根据不同的系统自动选择合适的路径分隔

    path = os.path.split(os.path.realpath(__file__))[0] + os.sep + 'cmds'
  3. 可以将所有的路径都使用正斜线:’/’, 在windows和linux都有效

    path = path.replace('\\', '/')
  4. 使用最新的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)

发表回复

您的电子邮箱地址不会被公开。