Post

Python Note - 02

Python Note - 02

str, byte, int转换

  • str -> int 使用int函数:
    1
    2
    
    x = int("43")
    y = int("0xff", 16)
    

    而使用base = 0可以自动探测前缀:

    1
    2
    
    x = int("0x43", 0)      # 67
    y = int("43", 0)        # 43
    
  • int -> str 普通十进制:
    1
    2
    3
    4
    
    s1 = int(63)    # "63"
    s2 = hex(48)    # "0x30"
    s3 = bin(15)    # "0b1111"
    s4 = oct(10)    # "0o12"
    

    另外可以使用自定义的base format:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    format(255, "x")
    # "ff"
    format(255, "#x")
    # "0x42"
    format(255, "X")
    # "FF"
    format(255, "#X")
    # "0XFF"
    format(66, "b")
    # "1000010"
    format(66, "#b")
    # "0b1000010"
    format(66, "o")
    # "102"
    format(66, "#o")
    # "0o102"
    format(66, "d")
    # "66"
    
  • int <-> bytes int.to_bytes
    1
    2
    3
    4
    5
    6
    7
    
    n = 0x12345678
    b1 = n.to_bytes(4, "big")
    print(b1)
    # b'\x12\x34\x56\x78'
    b2 = n.to_bytes(4, "little")
    print(b2)
    # b'\x78\x56\x34\x12'
    

    int.from_bytes

    1
    2
    3
    4
    
    b = b"\x78\x56\x34\x12"
    n = int.from_bytes(b, "little")
    print(hex(n))
    # 0x12345678
    
  • normal str <-> bytes 使用 .encode().decode(),还可以指定某些编码,比如utf-8

  • hex str <-> bytes bytes.fromhex()
    1
    2
    3
    4
    
    hex_s = "41424344"
    b = bytes.fromhex(hex_s)
    print(b)
    # b'ABCD'
    

    注意可以用removeprefix来删除字符的前缀:

    1
    2
    3
    4
    
    hex_s = "0x41424344"
    b = bytes.fromhex(hex_s.removeprefix("0x"))
    print(b)
    # b'ABCD'
    

str.hex()

1
2
3
4
b = b"ABCD"
hex_s = b.hex()
print(hex_s)
# 41424344

logger库使用

创建一个自己的logger并使用:

1
2
3
4
5
6
7
8
import logging

logger = logging.getLogger("my_app")       # my_app是当前log的名称,可以在后续的format中以name引用
logger.setLevel(logging.DEBUG)

logger.debug("debug message")
logger.info("hello")
logger.warning("something may be wrong")

另外,我们可以增加一些handler:

  • FileHandler FileHandler会将日志输出到文件中.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    import logging
    logger = logging.getLogger("demo")
    logger.setLevel(logging.DEBUG)
    #---------------------------------------#
    file_handler = logging.FileHandler("app.log", mode="w", encoding="utf-8")
    file_handler.setLevel(logging.DEBUG)
    logger.addHandler(file_handler)
    #---------------------------------------#
    logger.info("program started")
    logger.error("something wrong")
    
  • StreamHandler FileHandler会将日志输出到一个流中,默认是stderr, 也可以手动指定到一个特定的流,如logging.StreamHandler(sys.stdout)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    import logging
    logger = logging.getLogger("demo")
    logger.setLevel(logging.DEBUG)
    #---------------------------------------#
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.INFO)
    logger.addHandler(console_handler)
    #---------------------------------------#
    logger.info("hello")
    

补充:format 可以在file_handler中增加.

1
2
3
4
5
6
7
8
file_handler = logging.FileHandler("app.log", mode="w", encoding="utf-8")
formatter = logging.Formatter(
    "%(asctime)s [%(levelname)s] line:%(lineno)d - %(message)s",
    datefmt="%H:%M:%S",
)
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)

其中lineno是出现问题的行号,可以配合stacklevel来实现显示调用者行号的功能。 比如自己编写了一个函数some_func,里面用到了:

1
logger.info("xxx", stacklevel=2)

然后在某个脚本的第13行调用:

1
some_func()

然后就会在日志中记录第13行.

This post is licensed under CC BY 4.0 by the author.