- 自动生成指定长度的随机字符串
def generate_random_str(random_length=16, digits_str=True, ascii_str=True, punctuation_str=False):
"""
生成一个指定长度的随机字符串,其中
string.digits=0123456789
string.ascii_letters=abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
string.punctuation=!"#$%&'()*+,-./:;<=>?@[]^_`{|}~
:param random_length: 生成的字符串长度,默认16位
:param digits_str: 是否存在数字
:param ascii_str: 是否存在大小写字母
:param punctuation_str: 是否存在标点符号
:return: 一串字符串
"""
char = ''
if digits_str:
char += string.digits
if ascii_str:
char += string.ascii_letters
if punctuation_str:
char += string.punctuation
str_list = [random.choice(char) for _ in range(random_length)]
random_str = ''.join(str_list)
return random_str
- 验证字符串是否是正常的IP字符串
def valida_ip(ip: str):
"""验证IP"""
try:
ipaddress.ip_address(ip)
return True
except Exception:
return False
- 获取IP地址的地理信息
def get_geo(ip):
if ip.startswith(('192.168', '172.17', '0.0.0.0', '127.0.0.1')):
return ""
with geoip2.database.Reader('./util/GeoLite2-City.mmdb') as reader:
try:
response = reader.city(ip)
country_name_zh = response.country.names['zh-CN'] # 国家中文名字
province_name = response.subdivisions.most_specific.names['zh-CN'] # 省份名字
city = response.city.names['zh-CN']
return f"({country_name_zh} {province_name} {city})"
except Exception as e:
return ""
- 获取以当前日期到指定工作日的结束日期
# 需要pip install chinesecalendar
def from_workday_get_datetime(workday: int):
res_datetime = datetime.now()
while workday > 0:
res_datetime += timedelta(days=1)
if is_workday(res_datetime):
workday -= 1
return res_datetime
- 验证MAC地址是否有效
def valida_macaddr(macaddr: str):
"""验证mac地址"""
pattern = compile(r"^\s*([0-9a-fA-F]{2}-){5}[0-9a-fA-F]{2}\s*$" if "-" in macaddr
else r"^\s*([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}\s*$")
return True if pattern.match(macaddr) else False
- 时间戳转化为时间
def dns_time_convert_datetime(dns_time: int):
"""时间戳转换为时间"""
return strftime("%Y-%m-%d %H:%M:%S", localtime(dns_time))
- 重置字典类型字符串为字典类型
def reset_data(data: str):
try:
json_data = json.loads(data)
return json_data
except Exception as e:
raise ValueError("内容非法")
- 判断是否是一个有效的日期字符串
def is_valid_date(date_str):
"""
判断是否是一个有效的日期字符串
:param date_str:
:return:
"""
try:
datetime.datetime.strptime(date_str, "%Y-%m-%d")
return True
except Exception as e:
return False
- 字节单位转换
def StrOfSize(size):
"""
递归实现,精确为最大单位值 + 小数点后三位
"""
def strofsize(integer, remainder, level):
if integer >= 1024:
remainder = integer % 1024
integer //= 1024
level += 1
return strofsize(integer, remainder, level)
else:
return integer, remainder, level
units = ['B', 'K', 'M', 'G', 'T', 'PB']
integer, remainder, level = strofsize(size, 0, 0)
if level+1 > len(units):
level = -1
return '{}.{:>02d}{}'.format(integer, remainder, units[level])
- 为没有协议的url默认加上http协议
def init_url(url):
"""
为没有协议的url默认加上http协议
:param url: 原url路径
:return: 拥有协议的url路径
"""
# 判断url是否存在协议,不存在添加http协议
try:
url = re.search(r'\S+', url).group(0)
except Exception as e:
url = url
if not (url.startswith('http://') or url.startswith('https://')):
url = 'http://' + url
return url
- 检测url路径是否可以正常访问
def check_url(url):
"""
检测url路径是否可以正常访问
:param url: 需要请求的地址
:return: 是否正常访问的布尔值
"""
# 判定url存在
if not url:
return False
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
}
# 判断url是否可以访问
try:
code = requests.head(url, headers=headers, timeout=30).status_code
if code in [200, 301, 302]:
return True
else:
return False
except Exception as e:
return False
12.匹配手机号
def match_phone(phone: str):
try:
return True if re.match(r'^1[3-9]\d{9}$', phone) else False
except Exception as e:
return False