将文件加载到数组中,并根据输入对数组进行必要的更改,然后使用Python将其保存回文件

8xiog9wr  于 2023-06-07  发布在  Python
关注(0)|答案(1)|浏览(166)

下面的代码读取文件并将其存储到数组中,它在数组中搜索特定的用户名,并在数组中更改密码并将数组保存到文件中。
1.文件的第一列可以是 * 或DB名称
1.我想根据输入更改密码

* DB_USR    QWERTY   
* DB_MGR    QWERTY
TESTDB10 DB_USR PQRSTUV
TESTDB20 DB_USR QWERTY
TESTDB30 DB_USR QWERTY

下面是将文件读入数组并搜索数组的代码片段

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('#')] 

    username="DB_USR"
    pwd="PQRSTUV"

    pw_lines = [re.sub(fr'^(\s*{username}\S+)\s+', fr'\1{pwd}', line) for line in pw_lines]  # This line searches for a value DBFS_USR in 2nd column  and changes the password in 3rd column 
     
def main():   
  file_to_array()

我希望下面的正则表达式以两种方式工作,

pw_lines = [re.sub(fr'^(\b{username}\S+)\s+', fr'\1{pwd}', line) for line in pw_lines]  # This line searches for a value DB_USR in 2nd column  and changes the password in 3rd column

如果输入是./update_pwd TESTDB 10->,则必须更改以TESTDB 10开头的行中的密码
新文件:

* DB_USR    QWERTY   
 * DB_MGR    QWERTY
 TESTDB10 DB_USR PQRSTUV.  -> This value should change
 TESTDB20 DB_USR QWERTY
 TESTDB30 DB_USR QWERTY

如果输入只是./update_pwd ->,则应该更改以 * 开头的行中的密码
新文件:

* DB_USR    PQRSTUV    -> This value should change
 * DB_MGR    QWERTY
 TESTDB10 DB_USR QWERTY
 TESTDB20 DB_USR QWERTY
 TESTDB30 DB_USR QWERTY

到目前为止,正则表达式只对通配符行起作用,但如果我输入数据库名称,则不起作用。
我还想知道是否将文件数据存储在数组中并对其进行插值和更改是一种好方法,或者是否有比这更好的方法?我是python新手,请原谅我的错误

i86rm4rw

i86rm4rw1#

是的,对于您的情况,它是正确的读取文件到内存中,执行您的操作,并将结果写回文件,但你会有问题的大文件,因为内存问题,所以我们要修改一些东西.

import sys
import re

def file_to_array(db_name=None):
    file_info="/application/files/Password.txt"
    with open(file_info,'rt') as fh:
        pw_lines = [x.strip() for x in fh.readlines() if not x.startswith('#')]

    username="DB_USR"
    pwd="PQRSTUV"

    edited_lines = []
    for line in pw_lines:
        line_parts = line.split()
        if line_parts[1] == username and (not db_name or line_parts[0] == db_name):
            line_parts[2] = pwd
            edited_lines.append(' '.join(line_parts))
        else:
            edited_lines.append(line)

    with open(file_info, 'wt') as fh:
        for line in edited_lines:
            fh.write(line + '\n')

def main():   
    if len(sys.argv) > 1:
        db_name = sys.argv[1]
        file_to_array(db_name)
    else:
        file_to_array() 

if __name__ == '__main__':
    main()

相关问题