参考文献

数据类型

  • 数字
  • 字符串
  • 元组
  • 列表
  • 集合
  • 字典

运算符

  • //

    • 向下取整除法的运算符
    1
    2
    3
    4
    5
    >>> 17 / 3  # classic division returns a float
    5.666666666666667

    >>> 17 // 3 # floor division discards the fractional part
    5
  • ``

    • 乘方
    1
    2
    3
    4
    >>> 5 ** 2  # 5 squared
    25
    >>> 2 ** 7 # 2 to the power of 7
    128

字符串

  • 如果不希望前置 \ 的字符转义成特殊字符,可以使用 原始字符串,在引号前添加 r 即可:

    1
    2
    3
    4
    5
    >>> print('C:\some\name')  # here \n means newline!
    C:\some
    ame
    >>> print(r'C:\some\name') # note the r before the quote
    C:\some\name

字符串format()方法

1
2
>>> print('We are the {} who say "{}!"'.format('knights', 'Ni'))
We are the knights who say "Ni!"

索引

  • 索引还支持负数,用负数索引时,从右边开始计数:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> word = 'Python'
    >>> word[0] # character in position 0
    'P'
    >>> word[5] # character in position 5
    'n'
    >>> word[-1] # last character
    'n'
    >>> word[-2] # second-last character
    'o'
    >>> word[-6]
    'P'

切片

  • 切片索引的默认值很有用;省略开始索引时,默认值为 0,省略结束索引时,默认为到字符串的结尾:

    1
    2
    3
    4
    >>> word[0:2]  # characters from position 0 (included) to 2 (excluded)
    'Py'
    >>> word[2:5] # characters from position 2 (included) to 5 (excluded)
    'tho'
  • 索引指向的是字符 之间 ,第一个字符的左侧标为 0,最后一个字符的右侧标为n ,n 是字符串长度.例如:

    1
    2
    3
    4
    5
     +---+---+---+---+---+---+
    | P | y | t | h | o | n |
    +---+---+---+---+---+---+
    0 1 2 3 4 5 6
    -6 -5 -4 -3 -2 -1

流程控制

分支结构

1
2
3
4
5
6
7
x = 20
if x > 10: # 注意结尾的冒号:
print("if的判断结果为True")
print("x的值大于10")
else:
print("if的判断结果为False")
print("x的值小于10")

循环结构

1
2
3
4
5
6
7
start = 1
total = 10
sum = 0
while start <= total: # 条件为True 继续执行循环
sum += start
start += 1
print(sum) #条件为False循环结束,输出结果
1
2
3
total = list(range(1,11))  # 定义一个1-10 的列表
for i in total:
print(i)

列表

方法

  • list.append(x)
    • 在列表末尾添加一个元素,相当于 a[len(a):] = [x] .
  • list.extend(iterable)

    • 用可迭代对象的元素扩展列表.相当于 a[len(a):] = iterable .
  • list.insert(i, x)

    • 在指定位置插入元素.第一个参数是插入元素的索引,因此,a.insert(0, x) 在列表开头插入元素, a.insert(len(a), x) 等同于 a.append(x) .
  • list.remove(x)

    • 从列表中删除第一个值为 x 的元素.未找到指定元素时,触发 ValueError 异常.
  • list.pop([i])

    • 删除列表中指定位置的元素,并返回被删除的元素.未指定位置时,a.pop() 删除并返回列表的最后一个元素.(方法签名中 i 两边的方括号表示该参数是可选的,不是要求输入方括号).
  • list.clear()

    • 删除列表里的所有元素,相当于 del a[:] .
  • list.index(x[, start[, end]])

    • 返回列表中第一个值为 x 的元素的零基索引.未找到指定元素时,触发 ValueError 异常.可选参数 start 和 end 是切片符号,用于将搜索限制为列表的特定子序列.返回的索引是相对于整个序列的开始计算的,而不是 start 参数.
  • list.count(x)

    • 返回列表中元素 x 出现的次数.
  • list.sort(*, key=None, reverse=False)

    • 就地排序列表中的元素
  • list.reverse()

    • 翻转列表中的元素.
  • list.copy()

    • 返回列表的浅拷贝.相当于 a[:] .

操作系统接口

1
2
3
4
5
6
import os
os.getcwd() # Return the current working directory
#'C:\\Python312'
os.chdir('/server/accesslogs') # Change current working directory
os.system('mkdir today') # Run the command mkdir in the system shell
# 0
  • 对于日常文件和目录管理任务,shutil 模块提供了更易于使用的更高级别的接口

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import shutil
    shutil.copyfile('data.db', 'archive.db')
    #'archive.db'
    shutil.move('/build/executables', 'installdir')
    #'installdir'


    import os, shutil

    if os.path.isfile("unwanted-file.txt"):
    os.remove("unwanted-file.txt")

    if os.path.isdir("empty-dir"):
    os.rmdir("empty-dir")

    if os.path.isdir("nonempty-dir"):
    shutil.rmtree("nonempty-dir")

引用模块/包:import

1
2
3
4
5
6
7
8
# 导入一个模块
import model_name
# 导入多个模块
import module_name1,module_name2
# 导入包中指定模块
from package_name import moudule_name
# 导入包中所有模块
from package_name import *

日志组件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#format参数中可能用到的格式化串
# %(name)s Logger的名字
# %(levelno)s 数字形式的日志级别
# %(levelname)s 文本形式的日志级别
# %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
# %(filename)s 调用日志输出函数的模块的文件名
# %(module)s 调用日志输出函数的模块名
# %(funcName)s 调用日志输出函数的函数名
# %(lineno)d 调用日志输出函数的语句所在的代码行
# %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
# %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
# %(asctime)s 字符串形式的当前时间.默认格式是 “2003-07-08 16:49:45,896”.逗号后面的是毫秒
# %(thread)d 线程ID.可能没有
# %(threadName)s 线程名.可能没有
# %(process)d 进程ID.可能没有
# %(message)s用户输出的消息
1
2
3
4
5
6
7
8
import logging
import datetime


log_file = f"{datetime.datetime.now().strftime('%Y-%m-%d')}.log"

logging.basicConfig(filename=log_file, level=logging.INFO,
format='%(asctime)s %(levelname)s: %(message)s')

生成requirements.txt

1
2
3
4
# 安装
pip install pipreqs
# 在当前目录生成
pipreqs . --encoding=utf8 --force

正则表达式

re.match函数

  • re.match尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 none.

  • 语法:

    1
    re.match(pattern, string, flags=0)
    参数 描述
    pattern 匹配的正则表达式
    string 要匹配的字符串.
    flags 标志位,用于控制正则表达式的匹配方式,如: 是否区分大小写,多行匹配等等.
  • 可以使用group(num)groups() 匹配对象函数来获取匹配表达式

    匹配对象方法 描述
    group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组.
    groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号.

re.search方法

  • re.search扫描整个字符串并返回第一个成功的匹配.匹配成功re.search方法返回一个匹配的对象,否则返回None.

  • 语法:

    1
    re.search(pattern, string, flags=0)
    参数 描述
    pattern 匹配的正则表达式
    string 要匹配的字符串.
    flags 标志位,用于控制正则表达式的匹配方式,如: 是否区分大小写,多行匹配等等.

re.matchre.search的区别

  • re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配.

检索和替换

  • Python 的 re 模块提供了re.sub用于替换字符串中的匹配项.

  • 语法:

    1
    re.sub(pattern, repl, string, count=0, flags=0)
    参数 描述
    pattern 正则中的模式字符串
    repl 替换的字符串,也可为一个函数
    string 要被查找替换的原始字符串
    count 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配

re.compile 函数

  • compile函数用于编译正则表达式,生成一个正则表达式(Pattern )对象,供 match() 和 search() 这两个函数使用.

  • 语法:

    1
    re.compile(pattern[, flags])
    参数 描述
    pattern 一个字符串形式的正则表达式
    flags 可选,表示匹配模式,比如忽略大小写,多行模式等

findall函数

  • 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表.

  • **注意: ** matchsearch是匹配一次findall匹配所有.

  • 语法:

    1
    findall(string[, pos[, endpos]])
    参数 描述
    string 待匹配的字符串
    pos 可选参数,指定字符串的起始位置,默认为 0
    endpos 可选参数,指定字符串的结束位置,默认为字符串的长度

re.finditer函数

  • 和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回.

  • 语法

    1
    re.finditer(pattern, string, flags=0)
    参数 描述
    `pattern 匹配的正则表达式
    string 要匹配的字符串.
    flags 标志位,用于控制正则表达式的匹配方式,如: 是否区分大小写,多行匹配等等

re.split函数

  • split 方法按照能够匹配的子串将字符串分割后返回列表

  • 语法:

    1
    re.split(pattern, string[, maxsplit=0, flags=0])
    参数 描述
    pattern 匹配的正则表达式
    string 要匹配的字符串.
    maxsplit 分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数.
    flags 标志位,用于控制正则表达式的匹配方式,如: 是否区分大小写,多行匹配等等.

正则表达式修饰符 - 可选标志

  • 正则表达式可以包含一些可选标志修饰符来控制匹配的模式.修饰符被指定为一个可选的标志.多个标志可以通过按位 OR(|) 它们来指定.如 re.I | re.M 被设置成 I 和 M 标志:

    修饰符 描述
    re.I 使匹配对大小写不敏感
    re.L 做本地化识别(locale-aware)匹配
    re.M 多行匹配,影响 ^ 和 $
    re.S 使 . 匹配包括换行在内的所有字符
    re.U 根据Unicode字符集解析字符.这个标志影响 \w, \W, \b, \B.
    re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解.

示例

获取当前主机IP

1
2
3
4
5
6
7
8
9
10
import socket

# 获取主机名
hostname = socket.gethostname()

# 获取IP地址
ip_address = socket.gethostbyname(hostname)

print("当前主机名:", hostname)
print("当前IP地址:", ip_address)

判断文件是否存在

1
2
3
4
5
6
7
8
import os

file_path = "/path/to/file.txt" # 替换为要判断的文件路径

if os.path.exists(file_path):
print("文件存在")
else:
print("文件不存在")

读写文件

1
f = open('workfile', 'w', encoding="utf-8")
  • 第一个实参是文件名字符串.第二个实参是包含描述文件使用方式字符的字符串.
  • mode 的值包括 ‘r’ ,表示文件只能读取;‘w’ 表示只能写入(现有同名文件会被覆盖);‘a’ 表示打开文件并追加内容,任何写入的数据会自动添加到文件末尾.‘r+’ 表示打开文件进行读写.mode 实参是可选的,省略时的默认值为 ‘r’.
1
2
with open('workfile', encoding="utf-8") as f:
read_data = f.read()
  • 在处理文件对象时,最好使用 with 关键字.优点是,子句体结束后,文件会正确关闭,即便触发异常也可以.而且,使用 with 相比等效的 try-finally 代码块要简短得多

使用正则表达式规整数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import re

text = '''from: en
to: zh
query: cs
transtype: realtime
simple_means_flag: 3
sign: 728666.1047915
token: 4d623b9f3eccda988a94b569a2937821
domain: common
ts: 1701097036355'''

# 使用正则表达式匹配冒号两边的值,并添加单引号
pattern = r'(\w+)\s*:\s*(\w+)'
result = re.sub(pattern, r"'\1': '\2'", text)

print(result)