Чтение и запись переменных из файла

Я пытаюсь создать CLI регистрации/входа и не понимаю, почему переменные, которые я записываю в файле регистрации, не работают позже, когда я пытаюсь использовать их в части входа в систему.

Я думал, что это так же просто, как написать abc="xyz", а затем прочитать этот файл, но, похоже, это не так.

###RegOrLog###
RegOrLog = str(raw_input('[Register/Log]:'))

###register the user detail###
if RegOrLog in('r', 'reg', 'register'):
    reguser = raw_input('username:')
    regpass = raw_input('password:')
    regage = int(raw_input('age:'))
    reggender = str(raw_input('gender:'))

###creating file for the user###
    f = open(reguser, 'w')
    f.write('password =' + repr(regpass) + '\n')
    f.write('age =' + repr(regage) + '\n')
    f.write('gender =' + repr(reggender) + '\n')
    f.close()
    RegOrLog = 'log'

###login as a user###
if RegOrLog in('l','log','login'):
    loguser = raw_input('Login username:')
    regpass = raw_input('password:')

#registered user#
    regeduser = open(loguser, 'r')
    regeduser = regeduser.read()
    if regpass == password:
        print 'Welcome', loguser
        print 'You are', gender
        print 'You are', age,'years old'

person Eutos    schedule 20.09.2015    source источник
comment
Пожалуйста, выражайтесь яснее. Этот код работает? Если нет, то в чем проблема?   -  person    schedule 20.09.2015
comment
Код работает, но я не знаю, как использовать переменную внутри файла, который я сохранил.   -  person Eutos    schedule 20.09.2015
comment
Какая переменная? В вашем файле вы сохраняете пару данных, а не уникальную переменную. Я просто не могу понять вашу проблему.   -  person    schedule 20.09.2015
comment
внутри файла, который создает программа; пароль = syafiq12 возраст = 19 пол = мужской я хочу использовать возраст и пол для печати   -  person Eutos    schedule 20.09.2015
comment
я хочу, чтобы программа могла прочитать пароль, сохраненный в файле   -  person Eutos    schedule 20.09.2015
comment
Ok. Я понял ваш вопрос. Я собираюсь написать ответ для вас.   -  person    schedule 20.09.2015
comment
У меня есть хороший ответ для вас, но вам все еще нужно закодировать материал имени файла, который у вас уже был в вашем вопросе.   -  person    schedule 20.09.2015


Ответы (1)


Теперь я понимаю вашу проблему. Текстовый файл просто сохраняет простые данные, поэтому вы не можете создать файл, который будет писаться так, как если бы это был файл Python, с определением переменной, и ожидать, что при повторном чтении файла все эти переменные будут инициализированы. Python будет только читать данные и назначать их переменной, которая будет содержать весь текст, который вы изначально записали в этот файл.

Итак, подводя итог, вы обрабатываете текстовый файл как файл python и ожидаете, что python выполнит текстовый файл и создаст переменную.

Но это так не работает. Вы должны хранить данные в файле, похожем на базу данных (или в самой базе данных), затем читать их и посредством анализа данных извлекать переменные, которые вы ранее записали в текстовый файл.

Вы можете сделать это вручную, что не очень приятно, или вы можете использовать модуль Python под названием Pickle, который обрабатывает почти все, что вы написали бы сами, поэтому вам нужно будет использовать только этот модуль в своем коде.

Если вы ищете модуль Pickle в Google, веб-сайт Python.org предоставляет очень хороший пример его использования:

#Pickle Example

# Save a dictionary into a pickle file.
import pickle

favorite_color = { "lion": "yellow", "kitty": "red" }

pickle.dump( favorite_color, open( "save.p", "wb" ) )

# Load the dictionary back from the pickle file.

favorite_color = pickle.load( open( "save.p", "rb" ) )
# favorite_color is now { "lion": "yellow", "kitty": "red" }

Итак, как бы вы использовали это в своем коде? Это легко:

# RegOrLog

import pickle # new line!
RegOrLog = raw_input('[Register/Log]:') # why str()?

# register the user detail
if RegOrLog in('r', 'reg', 'register'):
    reguser = raw_input('username:') # raw_input gives string by default, if you want other data type then you do have to convert it.
    regpass = raw_input('password:')
    regage = int(raw_input('age:'))
    reggender =raw_input('gender:')

# creating file for the user
    data = {"username": reguser, "password": regpass, "age": regage, "gender": reggender}
    pickle.dump( data, open( "whatever_file_name", "wb" ) )
    RegOrLog = 'log'

###login as a user###
if RegOrLog in('l','log','login'):
    loguser = raw_input('Login username:')
    regpass = raw_input('password:')

#registered user#
    data = pickle.load( open( "whatever_file_name", "rb" ) )
    if regpass == data["password"]:
        print 'Welcome', loguser
        print 'You are', gender
        print 'You are', age,'years old'
person Community    schedule 20.09.2015
comment
Большое спасибо, сэр. я могу спокойно продолжить задание - person Eutos; 20.09.2015
comment
О, еще одно! Можете ли вы дать мне код для цикла, если файл или имя пользователя не соответствуют? - person Eutos; 21.09.2015
comment
@Eutos Мы можем превратить ваш код в более надежную систему входа в ООП (очевидно, не в ЦРУ, :D, я имею в виду более структурированный код, более читаемый и расширяемый). Я пришлю его вам, как только у меня будет немного свободного времени. - person ; 21.09.2015
comment
все в порядке, сэр. Это только для университетского задания, ничего страшного, но, кстати, спасибо - person Eutos; 21.09.2015
comment
РЭ: О, еще одно! Можете ли вы дать мне код для цикла, если файл или имя пользователя не выходят из файла. наверное это вопрос - person Eutos; 21.09.2015