Python не записывает в файл при работе в цикле - PullRequest
1 голос
/ 02 августа 2020

У меня есть Python файл file1.py со следующими строками кода:

uname="auto1@mailnesia.com"
pwd="abcdef"

Я хочу заменить uname на "auto2mailnesia.com", затем в "auto3@mailnesia.com" и так далее, а затем используйте обновленный uname в другом файле. Рассмотрим сценарий, в котором я хочу обновить uname с auto1 до auto3 .

У меня есть еще один Python файл file2.py со следующими строками кода:

from xxx.xxx import file1

for i in range(0,1):
    currentuser = (uname[uname.index('auto') + 4:uname.index('@')])
    newuser = str(int(currentuser) + 1)
    newusername = uname.replace(currentuser, newuser)
    print(uname)
    print(currentuser)
    print(newusername)
    print(newuser)

    with open(testdataFileName, 'r+') as f:
        text = f.read()
        text = re.sub(uname, newusername, text)
        f.seek(0)
        f.write(text)

Когда я запускаю file2.py в al oop из 1, то uname корректно обновляется в file1.py

Результат выглядит как следует:

auto1@mailnesia.com
1
auto2@mailnesia.com
2

Но, когда я запускаю file2.py в al oop, скажем, 3, тогда uname обновляется в file1.py только один раз.

Вывод такой следует:

test_auto1@mailnesia.com
1
test_auto2@mailnesia.com
2
test_auto1@mailnesia.com
1
test_auto2@mailnesia.com
2
test_auto1@mailnesia.com
1
test_auto2@mailnesia.com
2

Я не понимаю, почему uname обновляется только один раз в file1.py при работе в al oop.

Может кто-нибудь дать объяснение этому ?

Также, если бы кто-нибудь мог сказать мне, что я делаю не так и как это исправить, я был бы очень признателен.

Ответы [ 2 ]

1 голос
/ 02 августа 2020

Я знаю, что у тебя уже есть много ответов. Я подумал, что немного упрощу ваш код. Вам нужно прочитать только первую строку.

with open('your_filename.txt', 'r+') as f: #update your_filename with your filename
    text = f.readline()
    print ('previous value in file :', text)
    cuser = int(text[11:text.index('@')]) + 1
    text = text[:11]+str(cuser)+text[text.index('@'):]
    f.seek(0)
    f.write(text)
    print ('new value in file : ', text)

Вывод каждый раз при запуске изменяется. Мой первый запуск дал мне:

previous value in file : uname="auto1@mailnesia.com"

new value in file :  uname="auto2@mailnesia.com"

Содержимое файла отображается как:

uname="auto2@mailnesia.com"
pwd="abcdef"

Мой 4-й запуск дал мне:

previous value in file : uname="auto3@mailnesia.com"

new value in file :  uname="auto4@mailnesia.com"

Содержимое в файл отображается как:

uname="auto4@mailnesia.com"
pwd="abcdef"

Как видите, файл обновляется каждый раз, когда я запускаю код. Я не уверен, зачем вам нужно l oop несколько раз. Вы пытаетесь изменить значение в файле несколько раз при каждом запуске?

Я не уверен, действительно ли вам нужен al oop. Я обновил свой код, чтобы создать al oop, и он все еще работал. Вот обновленный код. Я просто использовал простой for loop

for i in range(4):

    with open('xyz.txt', 'r+') as f: #update your_filename with your filename

        text = f.readline()

        print ('previous value in file :', text)

        cuser = int(text[11:text.index('@')]) + 1
        text = text[:11]+str(cuser)+text[text.index('@'):]

        f.seek(0)
        f.write(text)

        print ('new value in file : ', text)

Вот результат, который я получил:

previous value in file : uname="auto4@mailnesia.com"

new value in file :  uname="auto5@mailnesia.com"

previous value in file : uname="auto5@mailnesia.com"

new value in file :  uname="auto6@mailnesia.com"

previous value in file : uname="auto6@mailnesia.com"

new value in file :  uname="auto7@mailnesia.com"

previous value in file : uname="auto7@mailnesia.com"

new value in file :  uname="auto8@mailnesia.com"

Значение в файле:

uname="auto8@mailnesia.com"
pwd="abcdef"
1 голос
/ 02 августа 2020

Ваша проблема в том, что uname остается неизменным на каждой итерации (независимо от того, что такое i). Он не обновляется в конце каждой итерации l oop. Вместо этого я рекомендую сохранить переменные currentusername и currentuser, чтобы можно было сохранить последнее имя пользователя и индекс (или идентификатор) и, следовательно, получить к ним доступ. Они будут инициализированы до начала l oop и обновлены перед началом каждой следующей итерации.

import re
uname="auto1@mailnesia.com"
pwd="abcdef"

# initialize
currentusername = uname
currentuser = (uname[uname.index('auto') + 4:uname.index('@')])

for i in range(0,4):
    print('\niteration ' + str(i))
    newuser = str(int(currentuser) + 1)
    newusername = currentusername.replace(currentuser, newuser)
    print("uname=" + uname)
    print("currentuser=" + currentuser)
    print("newusername=" + newusername)
    print("newuser=" + newuser)

    with open('somefile.dat', 'r+') as f:
        text = f.read()
        text = re.sub(currentusername, newusername, text)
        f.seek(0)
        f.write(text)

    # update for next iteration
    currentuser = newuser
    currentusername = newusername

Вывод:

iteration 0
currentusername=auto1@mailnesia.com
currentuser=1
newusername=auto2@mailnesia.com
newuser=2

iteration 1
currentusername=auto2@mailnesia.com
currentuser=2
newusername=auto3@mailnesia.com
newuser=3

iteration 2
currentusername=auto3@mailnesia.com
currentuser=3
newusername=auto4@mailnesia.com
newuser=4

iteration 3
currentusername=auto4@mailnesia.com
currentuser=4
newusername=auto5@mailnesia.com
newuser=5

В конец, somefile.dat будет включать auto5@mailnesia.com.

...