Python列表值修改:将哈希列表第二列统一替换为指定名称
批量替换哈希列表中的文件名统一为App1
需求说明
我有如下格式的哈希列表(存储在md5sum.txt文件中):
f71bc81a7e7d649f0d279b5861972eae ./.bash_history 22bfb8c1dd94b5f3813a2b25da67463f ./.bash_logout 1f98b8f3f3c8f8927eca945d59dcc1c6 ./.bashrc f4e81ade7d6f9fb342541152d08e7a97 ./.profile 595dbcceb1b5921f7fad73ad17ec1fe4 ./.python_history a23829cea89e42d79df01428e550191a ./.viminfo
需要将所有第二列的文件名替换为统一名称App1,处理后预期效果:
f71bc81a7e7d649f0d279b5861972eae App1 22bfb8c1dd94b5f3813a2b25da67463f App1 1f98b8f3f3c8f8927eca945d59dcc1c6 App1 f4e81ade7d6f9fb342541152d08e7a97 App1 595dbcceb1b5921f7fad73ad17ec1fe4 App1 a23829cea89e42d79df01428e550191a App1
我尝试过切片、遍历修改值,但未得到预期结果。以下是我尝试的代码:
import re f = open("md5sum.txt","r") read = f.read() ar = re.sub(r"\s+", "", read) splitting = ar.split('.') print(splitting[1]) for x in range(len(splitting)): if splitting[x] % 2 != 0: print("App1")
希望能得到相关解决帮助,谢谢。
问题分析
你的代码思路出现了几个关键问题:
- 用
re.sub(r"\s+", "", read)把所有空格都去掉了,这直接破坏了每行哈希和文件名的分隔结构,导致后续无法正确区分哈希值和文件名。 - 用
.分割整个字符串的方式完全不符合原始数据的格式逻辑,原始数据是每行一条记录,应该按行处理而非全局分割。 - 循环中用
splitting[x] % 2 != 0尝试判断奇偶索引,但splitting[x]是字符串,不能用取模运算,这会直接抛出类型错误。
解决方案
这里提供几种简单高效的实现方式:
方法1:逐行分割替换(最直观)
读取文件的每一行,按空格分割出哈希值,然后拼接上App1即可:
# 打开文件并逐行处理 with open("md5sum.txt", "r") as f: for line in f: # 去除行尾换行符,按空格分割(默认分割任意数量的空格) parts = line.strip().split() # 取第一个元素(哈希值),拼接App1后打印 if parts: # 跳过空行 print(f"{parts[0]} App1")
方法2:正则表达式替换(适合复杂格式)
用正则匹配每行中哈希值之后的所有内容,替换为App1:
import re with open("md5sum.txt", "r") as f: content = f.read() # 正则匹配:开头的哈希值(32位十六进制)+ 后面的任意内容,替换为哈希值 + App1 result = re.sub(r"^([0-9a-fA-F]{32})\s+.+$", r"\1 App1", content, flags=re.MULTILINE) print(result)
- 正则说明:
^([0-9a-fA-F]{32})匹配行首的32位MD5哈希值并捕获,\s+.+$匹配哈希值后的所有内容;替换时用\1引用捕获的哈希值,拼接App1。 flags=re.MULTILINE让^和$匹配每行的开头和结尾。
方法3:写入新文件(如果需要保存结果)
如果需要将处理后的内容保存到新文件,而不是仅打印,可以这样做:
with open("md5sum.txt", "r") as infile, open("md5sum_modified.txt", "w") as outfile: for line in infile: parts = line.strip().split() if parts: outfile.write(f"{parts[0]} App1\n")
内容的提问来源于stack exchange,提问作者js352
相关产品推荐
相关产品推荐

