Как удалить и переписать строку без неизвестных символов? - PullRequest
0 голосов
/ 07 мая 2020

У меня есть файл database.txt, в первом столбце указаны имена пользователей, вторые пароли, а остальные 5 вопросов и ответов для восстановления чередуются. Я хочу разрешить пользователю изменять пароль своих данных, не затрагивая имя пользователя другого пользователя, поскольку они могут быть такими же. Я нашел способ удалить предыдущий и добавить в файл новую строку измененных данных. Однако в начале добавляемой строки всегда есть строка или неизвестные символы. И изменяются другие символы, а не второе значение в списке. Пожалуйста, помогите мне найти способ избежать этого. https://repl.it/repls/NecessaryBoldButtons Вы можете найти здесь код, его изменение повлияет на всех, поэтому скопируйте его в другое место.

https://onlinegdb.com/BJbsn9-cL

Мне просто нужно, чтобы пароль был изменен при вводе пользователя, а не другие строки, причина всего этого кода в том, что при изменении пароля человека другое имя пользователя может быть изменено. Это исходный файл

Это то, что происходит потом, вторая строка в списке строки, где data [0] = "пока "следует менять только на newpass, а не на все остальные

'' 'import linecache

f = open("database.txt" , "r+")
for loop in range(3):
  line = f.readline()
  data = line.split(",")
  if data[1] == "bye":
    print(data[1])  #These are to help me understand what is happening
    print(data[0])
    b = data[0]
    newpass = "Hi"
    a = data[1]

    fn = 'database.txt'
    e = open(fn)
    output = []
    str="happy"
    for line in e:
      if not line.startswith(str):
        output.append(line)
    e.close()
    print(output)
    e = open(fn, 'w')
    e.writelines(output)
    e.close()

    line1 = linecache.getline("database.txt" ,loop+1)
    print(line)
    password = True
    print("Password Valid\n")
    write = (line1.replace(a, newpass))
    write = f.write(line1.replace(a, newpass))

f.close()

' ''

Это файл в текст:

имя пользователя, пароль, Recovery1, Answer1, Recovery2, Answer2, Recovery3, Answer3, Recovery4, Answer4,

Recovery5, Answer5, o, o, o, o, o, o, о, о, о, о,

счастливый, пока, о, о, о, о, о, о, о, о, о, о,

пока, счастливый, о, o, o, o, o, o, o, o, o, o,

Поддержка очень ценится

Не стесняйтесь изменять код столько, сколько вам нужно, так как это уже беспорядок

Заранее спасибо

1 Ответ

0 голосов
/ 07 мая 2020

Это должно быть довольно просто. Основная идея c такова:

open input file for reading
open output file for writing
for each line in input file
    if password = "happy"
        change user name in line
    write line to output file

Это должно быть довольно легко преобразовать в python.

Из комментариев и изучения вашего кода, я чувствую, что вы пытаетесь обновить строку на месте. То есть, похоже, что вы ожидаете, что, учитывая файл «database.txt», который содержит это:

username,password,Recovery1,Answer1,Recovery2,Answer2,Recovery3,Answer3, Recovery4,Answer4,Recovery5,Answer5,
o,o,o,o,o,o,o,o,o,o,
happy,bye,o,o,o,o,o,o,o,o,o,o,
bye,happy,o,o,o,o,o,o,o,o,o,o,

Когда вы вносите изменения, ваш новый «database.txt» будет содержать это:

username,password,Recovery1,Answer1,Recovery2,Answer2,Recovery3,Answer3, Recovery4,Answer4,Recovery5,Answer5,
o,o,o,o,o,o,o,o,o,o,
happy,Hi,o,o,o,o,o,o,o,o,o,o,
bye,happy,o,o,o,o,o,o,o,o,o,o,

Вы можете это сделать, но не можете сделать это на месте. Вы должны записать все строки файла, включая измененную строку, в новый временный файл. Затем вы можете удалить старый файл «database.txt» и переименовать временный файл.

Вы не можете обновить строку в текстовом файле, потому что, если вы измените длину строки, вы либо закончите вставьте лишний пробел в конце измененной строки (поскольку в новой строке меньше символов, чем в старой), или вы перезапишете начало следующей строки (новая строка длиннее старой).

Другой вариант - загрузить все строки в память и закрыть файл. Затем измените строку или строки, которые вы хотите изменить, в памяти. Наконец, откройте файл «database.txt» для записи и вывода всех строк из памяти в файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...