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_bytes1 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_bytes1 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.