学习Python(6)Python字符串类型&编码,解码,ASCII码&歌词解析器

学习Python(6)Python字符串类型&编码,解码,ASCII码&歌词解析器

概述

由多个字母,数字,特殊字符组成的有限序列
在Python中,使用单引号或者双引号都可以表示字符串
注意:没有单符号的数据类型
‘a’ “a”

常用转义字符

通过\来改变后面字母或者特殊字符的含义

\t  	相当于tab键
\n		相当于enter键
\b		相当于backspace

字符串基本功能

创建字符串

s = 'hello Lily'

长度

print(len(s))  # 10

索引

print(s[0])
print(s[1])
print(s[-1])

切片

print(s[6:])
print(s[4:7])
print(s[::-1])  # 'yliL olleh'

拼接

print("亲" + "我")

重复

print("给个好评!" * 3)

成员

print("a good" in "today is a good day!")  # True

遍历

s = "hello"
for c in s:
    print(c)  # 每个字符

for i in range(len(s)):
    print(i, s[i])  # 下标

for i,c in enumerate(s):
    print(i, c)  # 下标,字符

字符串是不可变

s = "hello"
# s[0] = "a"  # 报错
s = s + " world"
print(s)  # 'hello world'

字符串方法

count(): 子字符串出现的次数

s = "hello"
print(s.count('ll'))

大小写

print("hello".upper())  # 变成大写
print("HELLo1".lower())  # 变成小写
print("i loVE you".title())  # 每个单词首字母大写,其他变成小写
print("i loVE you".capitalize())  # 整个字符串首字母大写,其他变成小写
print("i loVE you".swapcase())  # 大小写切换

判断

print('1'.isdigit())  # 是否数字
print('abc'.isalpha())  # 是否字母
print('abc123'.isalnum())  # 是否字母或数字
print("abc123,".islower())  # 是否小写
print("ABC123,".isupper())  # 是否大写
print("Hello".istitle())  # 是否是title格式
print('   '.isspace())  # 是否只有空格

查找
find() : 从左往右查找子字符串第一次出现的下标, 如果不存在则返回-1
rfind() : 从右往左查找子字符串第一次出现的下标, 如果不存在则返回-1

s = 'Hong Kong driver diagnosed'
print(s.find('ong'))  # 1
print(s.find('ong2'))  # -1
print(s.rfind('ong'))  # 6
print(s.rfind('ong2'))  # -1

下面的不常用

print(s.index('ong'))  # 1
print(s.index('ong2'))  # 报错
print(s.rindex('ong'))  # 6
print(s.rindex('ong2'))  # 报错

拆分/分割
split(): 按照指定的字符串进行拆分,返回一个拆分之后的列表

s = "I love   you"
list1 = s.split()  # ['I', 'love', 'you']
list1 = s.split(" ")  # ['I', 'love', '', '', 'you']
list1 = s.split("love")  # ['I ', '   you']
list1 = s.split('hello')  # ['I love   you']
list1 = s.split('you')  # ['I love   ', '']
list1 = s.split('o', 1)  # ['I l', 've   you'], 按照前1个o来拆分
print(list1)

splitlines() : 按行拆分

s = '''论语
学而不思则罔
思而不学则殆
有朋自远方来
不亦乐乎
'''
print(s.splitlines())  # ['论语', '学而不思则罔', '思而不学则殆', '有朋自远方来', '不亦乐乎']
print(s.splitlines(True))  # ['论语\n', '学而不思则罔\n', '思而不学则殆\n', '有朋自远方来\n', '不亦乐乎\n']
print(s.split('\n'))  # ['论语', '学而不思则罔', '思而不学则殆', '有朋自远方来', '不亦乐乎', '']

合并
join() : 将列表中的所有字符串用指定的连接字符串合并

l = ['论语', '学而不思则罔', '思而不学则殆', '有朋自远方来', '不亦乐乎']
print( '+'.join(l) )
print( '\n'.join(l) )
print( '===='.join(l) )
# print( '+'.join([1,2,3]) )  # 报错

替换

s = 'mask have tesla tesla tesla'
s = s.replace('mask', '王传福')
print( s.replace('tesla', 'BYD') )  # 王传福 have BYD BYD BYD
print( s.replace('tesla', 'BYD', 2) )  # 王传福 have BYD BYD tesla
print(s)  # 王传福 have tesla tesla tesla

首尾匹配

s = 'hello kitty'
print(s.startswith('hell'))  # True
print(s.endswith('tty'))  # True

去除两边的指定字符: 了解

print('   hello   你好   '.strip())  # 'hello   你好'
print('----贾---玲----'.strip('-'))  # '贾---玲'
print('----贾---玲----'.lstrip('-'))  # '贾---玲----'
print('----贾---玲----'.rstrip('-'))  # '----贾---玲'

# 了解
print('沈腾'.center(60))  # 居中打印
print('沈腾'.center(60, '-'))
print('沈腾'.ljust(60, '-'))
print('沈腾'.rjust(60, '-'))
print('沈腾'.zfill(60))  # 靠右,其他0填充

eval(): 将字符串中的内容运算

print(eval("1+2"))  # 3
l = eval("[1,2,3]")
# l = list("[1,2,3]")
print(l, type(l))  # list

# a, b = eval( input(":") )
# print(a, b)

简单加密

trans = str.maketrans("abc", "123")
print("I am a cool boy".translate(trans))
# 'I 1m 1 3ool 2oy'

编码&解码&ASCII码

编码

编码: 字符串=>二进制

s = "Python 牛!"
b = s.encode()  # 默认UTF-8编码, b'Python \xe7\x89\x9b!'
# b = s.encode('utf-8')
# b = s.encode('GBK')
print(b)

解码

解码: 二进制=>字符串

s2 = b.decode()
print(s2)  # 'Python 牛!'

ASCII码转换

print(ord('a'))  # 97
print(chr(100))  # d

歌词解析器

按照歌词时间,每隔1秒显示下句歌词
time.sleep(1) # 暂停1秒

1, 按行拆分, 得到每一行歌词, 如:lineStr = '[04:40.75][02:39.90][00:36.25]只是因为在人群中多看了你一眼'
2, 将每一行歌词按照']'拆分,得到列表,
  如 lineList = ['[04:40.75', '[02:39.90', '[00:36.25', '只是因为在人群中多看了你一眼']
3,  将歌词内容, 和歌词时间分别取出, 可以使用字典来保存歌词时间和对应的歌词内容
          lrcDict = {}
  歌词内容 lrcContent = lineList.pop()  # '只是因为在人群中多看了你一眼'
          lineList变成: ['[04:40.75', '[02:39.90', '[00:36.25']
  歌词时间 for lrcTime in lineList:
              lrcTime2 = lrcTime[1:]
              lrcDict[lrcTime2] = lrcContent

      # 歌词内容就会按以下方式存储
      # lrcDict = {'04:40.75': '只是因为在人群中多看了你一眼',
                   '02:39.90': '只是因为在人群中多看了你一眼',
                   '00:36.25': '只是因为在人群中多看了你一眼'
                  }

      注意歌词时间需要转换成秒,如:lrcDict[lrcTime] = lrcContent

4, 将lrcDict中的lrcTime全部取出存放在列表中,将列表升序排序,
5,最后遍历列表, 每隔1秒 按照歌词的时间取出对应的歌词内容
musicLrcStr = """[00:03.50]传奇
[00:19.10]作词:刘兵 作曲:李健
[00:20.60]演唱:王菲
[00:26.60]
[04:40.75][02:39.90][00:36.25]只是因为在人群中多看了你一眼
[04:49.00]
[02:47.44][00:43.69]再也没能忘掉你容颜
[02:54.83][00:51.24]梦想着偶然能有一天再相见
[03:02.32][00:58.75]从此我开始孤单思念
[03:08.15][01:04.30]
[03:09.35][01:05.50]想你时你在天边
[03:16.90][01:13.13]想你时你在眼前
[03:24.42][01:20.92]想你时你在脑海
[03:31.85][01:28.44]想你时你在心田
[03:38.67][01:35.05]
[04:09.96][03:39.87][01:36.25]宁愿相信我们前世有约
[04:16.37][03:46.38][01:42.47]今生的爱情故事 不会再改变
[04:24.82][03:54.83][01:51.18]宁愿用这一生等你发现
[04:31.38][04:01.40][01:57.43]我一直在你身旁 从未走远
[04:39.55][04:09.00][02:07.85]
"""
# 先将所有的时间和歌词放在列表中

# 按行拆分
lrc_list = musicLrcStr.splitlines()
# print(lrc_list)


# 列表存放所有时间和歌词
# music_list = [{'time': '00:22:33', 'content':''}]
music_list = []

# 遍历每一行歌词
for lrc in lrc_list:
    # print(lrc)  # 其中的每一行歌词内容

    # 按']'拆分
    line_list = lrc.split(']')
    # print(line_list)

    # 歌词内容
    lrc_content = line_list.pop()
    # print(line_list)

    # 遍历每一行的所有歌词时间
    for lrc_time in line_list:
        lrc_time = lrc_time[1:]  # 将'['去掉
        # print(lrc_time)

        music_dict = {'time': lrc_time, 'content': lrc_content}
        music_list.append(music_dict)

# print(music_list)
# [{'time': '00:03.50', 'content': '传奇'}, {'time': '00:19.10', 'content': '作词:刘兵 作曲:李健'}, {'time': '00:20.60', 'content': '演唱:王菲'}, {'time': '00:26.60', 'content': ''}, {'time': '04:40.75', 'content': '只是因为在人群中多看了你一眼'}, {'time': '02:39.90', 'content': '只是因为在人群中多看了你一眼'}, {'time': '00:36.25', 'content': '只是因为在人群中多看了你一眼'}, {'time': '04:49.00', 'content': ''}, {'time': '02:47.44', 'content': '再也没能忘掉你容颜'}, {'time': '00:43.69', 'content': '再也没能忘掉你容颜'}, {'time': '02:54.83', 'content': '梦想着偶然能有一天再相见'}, {'time': '00:51.24', 'content': '梦想着偶然能有一天再相见'}, {'time': '03:02.32', 'content': '从此我开始孤单思念'}, {'time': '00:58.75', 'content': '从此我开始孤单思念'}, {'time': '03:08.15', 'content': ''}, {'time': '01:04.30', 'content': ''}, {'time': '03:09.35', 'content': '想你时你在天边'}, {'time': '01:05.50', 'content': '想你时你在天边'}, {'time': '03:16.90', 'content': '想你时你在眼前'}, {'time': '01:13.13', 'content': '想你时你在眼前'}, {'time': '03:24.42', 'content': '想你时你在脑海'}, {'time': '01:20.92', 'content': '想你时你在脑海'}, {'time': '03:31.85', 'content': '想你时你在心田'}, {'time': '01:28.44', 'content': '想你时你在心田'}, {'time': '03:38.67', 'content': ''}, {'time': '01:35.05', 'content': ''}, {'time': '04:09.96', 'content': '宁愿相信我们前世有约'}, {'time': '03:39.87', 'content': '宁愿相信我们前世有约'}, {'time': '01:36.25', 'content': '宁愿相信我们前世有约'}, {'time': '04:16.37', 'content': '今生的爱情故事 不会再改变'}, {'time': '03:46.38', 'content': '今生的爱情故事 不会再改变'}, {'time': '01:42.47', 'content': '今生的爱情故事 不会再改变'}, {'time': '04:24.82', 'content': '宁愿用这一生等你发现'}, {'time': '03:54.83', 'content': '宁愿用这一生等你发现'}, {'time': '01:51.18', 'content': '宁愿用这一生等你发现'}, {'time': '04:31.38', 'content': '我一直在你身旁 从未走远'}, {'time': '04:01.40', 'content': '我一直在你身旁 从未走远'}, {'time': '01:57.43', 'content': '我一直在你身旁 从未走远'}, {'time': '04:39.55', 'content': ''}, {'time': '04:09.00', 'content': ''}, {'time': '02:07.85', 'content': ''}]

# 升序
music_list.sort(key=lambda a:a['time'])

# for d in music_list:
#     print(d)


import time

# for d in music_list:
#     print(f'{d["time"]} : {d["content"]}')
#     time.sleep(1)  # 暂停1秒

sec = 0
for d in music_list:
    t = d['time']
    i = t.find(':')
    t2 = float(t[:i])*60 + float(t[i+1:])  # 秒

    time.sleep(t2 - sec)  # 暂停
    sec = t2

    print(f'{d["time"]} : {d["content"]}')

猜你喜欢

转载自blog.csdn.net/qq_43284558/article/details/107645183