读取m3u8文件内容存入字典时while循环不运行无报错如何解决
问题原因
- 你只在进入while循环前对
y1做了一次赋值,循环过程中x2递增后y1没有同步更新,永远等于y[0]也就是#EXTENC,只要当前行不是这个标签就会一直累加x2直到退出循环,根本不会执行匹配逻辑。 - 循环判断条件写的是
x2<=len(y),列表索引最大为len(y)-1,当x2等于len(y)时会触发索引越界错误,应该改为x2 < len(y)。 - 拆分标签行后取值错误,你用了行号变量
x作为split结果的索引,split后的列表最多只有2个元素(标签名、标签值),只能用固定索引0和1取值,当x大于1时会直接触发索引错误。 - 你定义的标签列表
y里,EXT-X-DISCONTINUITY-SEQUENCE前面少写了#,就算走到对应分支也匹配不到该标签。 - 你的逻辑默认标签在m3u8文件里的出现顺序和你定义的
y列表顺序完全一致,但实际m3u8的标签没有强制顺序,一旦顺序不匹配就会漏匹配。
修正后代码
with open("Downloads/chunk.m3u8", "r", encoding="utf-8") as f: lines = f.readlines() infodict = {} # 预定义所有要匹配的标签 tags = ["#EXTENC","#PLAYLIST","#EXTGRP","#EXTLAP","#EXTART","#EXTGENRE","#EXTM3A","#EXTBYT","#EXTBIN","#EXTIMG","#EXT-X-VERSION","#EXT-X-START","#EXT-X-PLAYLIST-TYPE","#EXT-X-TARGETDURATION","#EXT-X-MEDIA-SEQUENCE","#EXT-X-INDEPENDENT-SEGMENTS","#EXT-X-MEDIA","#EXT-X-STREAM-INF","#EXT-X-BYTERANGE","#EXT-X-DISCONTINUITY","#EXT-X-DISCONTINUITY-SEQUENCE","#EXT-X-KEY","#EXT-X-MAP","#EXT-X-PROGRAM-DATE-TIME","#EXT-X-DATERANGE","#EXT-X-I-FRAMES-ONLY","#EXT-X-I-FRAME-STREAM-INF","#EXT-X-SESSION-DATA","#EXT-X-SESSION-KEY"] line_idx = 0 # 先匹配开头的EXTM3U if "#EXTM3U" in lines[line_idx]: infodict["#EXTM3U"] = "" line_idx += 1 # 遍历所有行匹配标签 while line_idx < len(lines): current_line = lines[line_idx].rstrip("\n") # 遇到结束标签直接退出 if "#EXT-X-ENDLIST" in current_line: break # 匹配所有预定义标签 for tag in tags: if tag in current_line: tag_info = current_line.split(":", 1) if len(tag_info) == 2: infodict[tag_info[0] + ":"] = tag_info[1] else: infodict[tag_info[0]] = "" break line_idx += 1 print(infodict)
内容的提问来源于stack exchange,提问作者user17328377
相关产品推荐
相关产品推荐

