You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 08:47:39