如何用Python修改空格分隔文件中指定用户密码并备份原文件?
问题需求
需要用Python实现:在空格分隔的密码文件中,将DB_USR的密码从ABCDEF修改为PQRSTU。目前已完成读取文件到数组、正则匹配用户的代码,但不清楚如何修改数组中的对应密码、写入新文件并备份原文件,求可行方案及具体实现步骤。
现有读取文件代码:
import sys import logging def file_to_array(): file_info="/application/files/Password.txt" with open (file_info,'rt') ass fh: pw_lines = [x.strip() for x in fh.readlines() if not x.startswith('#')] #ignore comments passwd = find_in_pwfile(pw_lines=pw_lines, key1="", key2="DBFS_USR") def main(): file_to_array()
原文件内容:
* DB_USR ABCDEF * DB_MGR QWERTY
期望修改后的文件内容:
* DB_USR PQRSTU * DB_MGR QWERTY
现有匹配用户的代码:
def find_in_pwfile(pw_lines, key1, key2) patterns = ['^{k1}\\s'+{k2}\\s+(\\S+)\\s*$.format(k1=key1 , k2=key2), '^\\*\\s'+{k2}\\s+(\\S+)\\s*$.format( k2=key2), '^{k1}\\s'+\\*\\s+(\\S+)\\s*$.format(k1=key1) ]. #These are various patterns in password file for pattern in patterns: for line in pwlines m = re.match(pattern, line) if m is not None s= "PQRSTU" replaced_line=m.group(0).replace(m.group(1),s) return m.group(1) #if we reach this point no match has been found reach 'NotFound'
可行方案及实现步骤
1. 备份原文件
修改前必须先备份原文件,防止操作失误导致数据丢失。使用shutil.copy2复制原文件并添加.bak后缀,同时保留文件的元数据(权限、创建时间等)。
2. 修正正则匹配逻辑并修改目标行
原匹配函数仅返回匹配到的密码,未实现行修改功能。调整逻辑为:遍历所有行,找到匹配DB_USR的行后替换密码,其余行保持不变。同时修正原代码中的语法错误(如缺少冒号、字符串格式化错误、变量名拼写错误等)。
3. 写入修改后的内容
将修改后的行列表写入原文件,完成密码更新,注意保留原文件的注释和格式。
完整实现代码
import sys import logging import re import shutil def backup_file(file_path): # 备份原文件,添加.bak后缀 backup_path = f"{file_path}.bak" shutil.copy2(file_path, backup_path) logging.info(f"原文件已备份至: {backup_path}") def modify_db_usr_password(file_path, new_password): # 读取文件内容,保留换行符避免格式混乱 with open(file_path, 'rt') as fh: all_lines = [line.rstrip('\n') for line in fh] modified_lines = [] # 匹配DB_USR行的正则模式,兼容文件格式 pattern = r'^\*\s+DB_USR\s+(\S+)\s*$' for line in all_lines: # 保留注释行 if line.startswith('#'): modified_lines.append(line) continue # 匹配目标行并替换密码 match = re.match(pattern, line) if match: modified_line = line.replace(match.group(1), new_password) modified_lines.append(modified_line) logging.info(f"已修改DB_USR的密码为: {new_password}") else: # 其他行直接保留 modified_lines.append(line) # 将修改后的内容写入原文件 with open(file_path, 'wt') as fh: fh.write('\n'.join(modified_lines) + '\n') def main(): logging.basicConfig(level=logging.INFO) pw_file = "/application/files/Password.txt" new_pw = "PQRSTU" try: backup_file(pw_file) modify_db_usr_password(pw_file, new_pw) logging.info("密码修改完成") except Exception as e: logging.error(f"操作失败: {str(e)}") sys.exit(1) if __name__ == "__main__": main()
代码说明
- 备份功能:用
shutil.copy2实现文件备份,保留原文件的权限、创建时间等元数据。 - 正则匹配:针对文件中
* DB_USR ABCDEF的格式,编写精准正则匹配密码部分,确保只修改目标行。 - 格式保留:读取时保留换行符,写入时还原原文件结构,避免破坏注释和其他行的格式。
- 错误处理:添加异常捕获,操作失败时输出错误信息并退出,便于排查问题。
内容的提问来源于stack exchange,提问作者LearningCpp
相关产品推荐
相关产品推荐

