【python教程入门学习】基础篇: 5. Python爱恨交织的字符串

2024-03-02 18:58

本文主要是介绍【python教程入门学习】基础篇: 5. Python爱恨交织的字符串,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Python2.x的字符串的确是个大坑,每次编码都要小心翼翼地处理,但它优秀简洁的文本处理能力是不可不提的。

  1. 基础用法

字符串的基础用法
1.1 字符串初始化

a = str(“ababa”)

单引号和双引号没什么区别

b = ‘1’
b = “1”

1.2 字符串格式化

简单地展示了两种字符串格式化的用法,更详细地只能去查文档了,特别拿出来一些很常用的方式

用百分号和元组的格式化%d是整型,02表示最少两位,不足前面补0,一般用于日期都可以,保证年月日是8位数字。%f是输出浮点数,.2表示只保留两位小数%s是输出字符串
format()函数是推荐的,花括号里面带数字表示第几个位置,也可以用关键字,一共两种。看自己的续期使用吧,也不一定特别好,关键字的比较太长了,有时候写个格式化都很麻烦。位置短小,适合快速。就是看需求千分位加逗号这个很实用,冒号加逗号就可以了,自动分。

以前的方式

print("%s %02d %.2f" % (“strings”, 1, 0.2))
strings 01 0.20

新的使用format函数

print("{0} {1:,}".format(“strings”, 100000000))
strings 100,000,000

关键字

print("{uid} {vote_num}".format(vote_num=1, uid=1000))
1000 1

一样效果,**表示关键字传参

params = {“uid”: 1000, “vote_num”: 1}
print("{uid} {vote_num}".format(**params ))

下面这种经常有人犯的错,

print("{uid} {vote_num}".format(params))

1.3 字符串长度

len(“123”)
3

1.4 字符串的截取

“123”[1:]
23

1.5 字符串合并

几个字符串合并是非常常见的情况,一开始大家都喜欢用+号来联合字符串,但这样的做法在字符串数量非常多的情况下,程序性能是极其低下的,养成良好的编程习惯比出问题的时候干着急更为有效。对于新手小白想更轻松的学好Python基础,Python爬虫,web开发、大数据,数据分析,人工智能等技术,这里给大家分享系统教学资源,架下我尉♥: 2763177065 【教程/工具/方法/解疑】

用格式化方式,组合几个字符串,这样往往用在字符串数量已经明确知道的情况。
用join()函数,传入的参数是个可迭代对象

如前面dict所提到的,多个字段查询对应一个数据的时候,我们可以写一个通用的方式生成key

keys = [“uid”, “day”, “hour”, ]

下划线是分隔符

key = “_”.join(keys)
uid_day_hour

1.6 简单的字符匹配

startswith()判断字符串是否以参数为开头,
endswith判断字符串是否以参数为结束的

#判断字符串是否相等
print(“aa” == “aa”)
True
print(“Hello world!”.startswith(“He”))
True
print(“Hello world!”.endswith(“world!”))

这两个函数常用于文件过滤判断,endswith就很明显用于文件扩张名来判断,startswith一般用于路径判断或者一系列文件都是以某个前缀开头的,在文件目录和文明处理方面,这两个函数很方便。
1.7 删除字符串中的字符

字符串经常会进行一些编辑,例如读取文件行数据的时候,需要清除掉前后的空白字符,包括看不见的换行符等,有时候两个字符串相比较,最好也是先去掉空白字符,这样就不会出现看起来相等,但机器判断是不相等的。

strip()这个函数是处理字符串开头和末尾的,不传参默认去掉空白字符再返回新的字符串。传入的参数一个字符串,包含了要删掉前后的字符,这个很有意思但不常用,因为大厂讲求一个稳字,业务但最常用的还是去掉前后空白字符。
lstrip()只是去掉字符串开头的。
rstrip()去掉字符串结尾的。

a = " 10000 "
print(a.strip() == “10000”)
True
print(a.lstrip() == "10000 “)
True
print(a.lstrip() == " 10000”)
True

文档例子

‘www.example.com’.strip(‘cmowz.’)
‘example’

1.8 简单查找字符串

查找字符串里面有没有字符,这里不涉及正则匹配模块,只是简单运用str的几个函数.

“Py’ in “Python”
True

返回下标位置

“Python”.find(“yt”)
1
“Python”.find(“yd”)
-1

从结尾开始查查找模式串,下面是简单获取文件名的方法,经常这是这样处理的。

如果要平台移植性,用os.sep

idx = “/home/ryan/test/my.txt”.rfind("/")
if idx != -1:
print( “/home/ryan/test/my.txt”[idx+1:])
else:
print("")
my.txt

  1. 例子-日志文件读取

Python很适合做数据分析,我也经常写Python脚本去分析或者获取日志数据,这里举个简单的生产日志分析例子,从日志文件中读取出时间、用户UID和票数并打印出来。最后,如果你的时间不是很紧张,并且又想快速的python提高,最重要的是不怕吃苦,建议你可以架尉♥信(同音):276 3177 065 ,那个真的很不错,很多人进步都很快,需要你不怕吃苦哦!大家可以去添加上看一下~

日志都是行数据,每行包括三个元素,日期时间、日志级别和json格式的数据(很多人问为什么不直接一行一个json log呢?新的可以自己这样改过来,但旧的改动比较大,所以还需要部分渐进地改)

2019-10-28 10:00:00 INFO {“msg”:“add uid vote num succ”, “uid”:1000, “new_vote_num”: 2000, “add_vote_num”: 1000}
2019-10-28 10:00:00 INFO {“msg”:“add uid vote num succ”, “uid”:1002, “new_vote_num”: 5000, “add_vote_num”: 500}
2019-10-28 10:00:00 INFO {“msg”:“add uid vote num succ”, “uid”:1001, “new_vote_num”: 1000, “add_vote_num”: 300}

格式是日期时间、日志级别再带一个json对象:

YYYY-mm-dd HH:MM:SS DEBUG_LEVEL {}

代码如下:

#! /usr/bin/env python

-- coding: utf-8 --

import sys
import json
from datetime import datetime

def my_strptime(data):
# 先分出日期和时间
date_str, time_str = data.split()
year, month, day = map(int, date_str.split("-"))
hour, minute, second = map(int, time_str.split("😊)
return datetime(year, month, day, hour, minute, second)

def main():
# 从命令行中获取文件名参数,argv[0]是程序文件名
fname = sys.argv[1]
# f是文件描述符
f = open(fname, “r”)
datas = []
for line in f:
line = line.strip()
# 先找真正信息左花括号
start_idx = line.find("{")
# 格式不正确的
if start_idx <= 2:
continue
prefix_str = line[:start_idx-2]
# 切分出三个元素,日期,时间和日志级别
prefix_str_list = prefix_str.split()
#怎么将时间转为python的时间类型呢,很多人都会看了文档直接用strptime,但这个函数有bug,我们一般换一种方式来实现
dt = my_strptime(prefix_str_list[0] + " " + prefix_str_list[1])
level = prefix_str_list[2]

    json_data = json.loads(line[start_idx:])each_obj = {}each_obj["level"] = leveleach_obj["dt"] = dteach_obj["data"] = json_datadatas.append(each_obj)# 输出时间、uid和最新的票数
fmt = "{dt} {uid} {vote_num:,}"
for row in datas:dt = row.get("dt", "")data = row.get("data", {})uid = data.get("uid", 0)vote_num = data.get("new_vote_num", 0)      content = fmt.format(dt = dt, uid= uid, vote_num = vote_num)print(content)

if name == ‘main’:
main()

先看main函数,跳过读取文件的diamante
line.find先找到第一个{的位置,然后前面是日期和日志级别,后面是json对象
对前面的进行空格切分会分出三个元素:日期: "2019-10-28"时间: 10:00:00日志级别: INFO
由于直接用strptime在多线程环境下有bug,我们习惯都是不用的,所以我直接写了个替换,传入日期时间2019-10-28 10:00:00返回一个datetime对象
从start_idx到结尾都是json对象,所以直接用json.loads来转化为python的dict。
fmt用了千分位逗号分隔符,方便阅读。

3.总结

字符串的操作在日常任务上面占比了很大一部分,由于Python的便捷性,很多时候日志的分析都会用Python,在shell已经无法满足的时候。上文提供的例子只是一个简化地应用,但已经好很贴近我以前接触到的日志分析和统计数据了。其实字符串存在很多坑,是在Python3才慢慢修复的,但无法避免的是我们必须要正面去了解,才能在日常任务中避免犯错。我曾经见过很逗字符串不熟悉,导致连打日志都报错,无法跟踪想打的是什么日志。所以接着我会回顾一下Python字符串的坑。

这篇关于【python教程入门学习】基础篇: 5. Python爱恨交织的字符串的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/767106

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss