Python格式化输出查询参数(Query Parameters)

0 阅读2分钟

功能介绍

实际是Anroid开发中,想要更清晰查看Http请求中Query Parameters的参数值传递是否有问题,又同时在学习python语言,完成一段Python小程序

实现效果

image.png

具体代码实现

import urllib.parse
import sys
from typing import Dict, List
import unicodedata

def get_string_width(s: str) -> int:
    """
    计算字符串的显示宽度,中文字符计为2个宽度,解决对齐问题
    
    参数:
        s (str): 要计算宽度的字符串
    
    返回:
        int: 字符串的显示宽度
    """
    width = 0
    for char in s:
        # 获取字符的东亚宽度属性
        if unicodedata.east_asian_width(char) in ('F', 'W', 'A'):
            width += 2
        else:
            width += 1
    return width

def format_cell(content: str, width: int) -> str:
    """
    格式化表格单元格,确保对齐
    
    参数:
        content: 单元格内容
        width: 需要的宽度
    
    返回:
        str: 格式化后的单元格内容
    """
    content_width = get_string_width(content)
    padding = width - content_width
    if padding < 0:
        padding = 0
    content_bytes = content.encode('utf-8')
    content_display = content_bytes.decode('utf-8')
    return f" {content_display}{' ' * padding} "

def parse_http_get_params(query_string):
    """
    解析HTTP GET参数字符串,返回参数字典
    
    参数:
        query_string (str): HTTP GET参数字符串,例如 'param1=value1&param2=value2'
    
    返回:
        dict: 参数名称和值的字典
    """
    # 移除可能存在的问号前缀
    if '?' in query_string:
        query_string = query_string.split('?', 1)[1]
    
    # 使用urllib.parse解析参数,保留空值
    params_dict = dict(urllib.parse.parse_qsl(query_string, keep_blank_values=True))
    return params_dict

def format_params_table(params_dict: Dict[str, str]) -> List[List[str]]:
    """
    将参数字典转换为表格数据
    
    参数:
        params_dict (dict): 参数名称和值的字典
    
    返回:
        list: 包含参数名和参数值的二维列表
    """
    # 转换为表格数据结构
    table_data = [['参数名', '参数值']]  # 表头
    table_data.extend([[key, str(value)] for key, value in params_dict.items()])
    return table_data

def print_table(table_data: List[List[str]]) -> None:
    """
    打印格式化的表格
    
    参数:
        table_data: 要打印的表格数据
    """
    # 计算每列的最大显示宽度
    col_widths = []
    for i in range(len(table_data[0])):
        max_width = 0
        for row in table_data:
            width = get_string_width(str(row[i]))
            max_width = max(max_width, width)
        col_widths.append(max_width)
    
    # 生成分隔线
    separator = '+'
    for width in col_widths:
        separator += '-' * (width + 2) + '+'
    
    # 打印表头
    print(separator)
    header_cells = [format_cell(col, width) for col, width in zip(table_data[0], col_widths)]
    print('|' + '|'.join(header_cells) + '|')
    print(separator)
    
    # 打印数据行
    for row in table_data[1:]:
        cells = [format_cell(str(cell), width) for cell, width in zip(row, col_widths)]
        print('|' + '|'.join(cells) + '|')
    print(separator)

def main():
    # 检查是否提供了命令行参数
    if len(sys.argv) > 1:
        query_string = sys.argv[1]
    else:
        # 如果没有命令行参数,提示用户输入
        query_string = input("请输入HTTP 参数字符串: ")
    
    # 解析参数
    params_dict = parse_http_get_params(query_string)
    # 转换为表格数据
    table_data = format_params_table(params_dict)
    
    print("\nHTTP参数表格:")
    print_table(table_data)

if __name__ == "__main__":
    main()