It's far from impossible and there's many ways to achieve this. But for very simple personal use scripts I don't bother myself with much more than this.
def load_user_data():
...."""Return user data loaded from file or empty list"""
....try:
........with open("user_data.txt", "r") as thefile: # "r" for read access
............data_as_string = thefile.read()
............data = eval(data_as_string)
............return data
....except IOError: # happens when file not found
........return []
def save_user_data(data):
....with open("user_data.txt", "w") as thefile: # "w" for write access
........data_as_string = str(data)
........thefile.write(data_as_string)
>>> simple_user_data = [("John", "abc123$"), ("Mary", "abc123*")]
>>> save_user_data(simple_user_data)
>>> simple_user_data = load_user_data()
>>> print simple_user_data
[('John', 'abc123$'), ('Mary', 'abc123*')]
>>>
>>> name_to_password = dict([(n, p) for n, p in simple_user_data])
>>> password_to_name = dict([(p, n) for n, p in simple_user_data])
>>> save_user_data([name_to_password, password_to_name]) # note the surrounding list
>>> name_to_password, password_to_name = load_user_data()
The four lines above is just to show you when you save the data you can group them in arbitrary ways and mix different data structures however you want, because the result can still always be converted to a string and then back again with eval.
Getting user input is another question entirely. In Python 3 you use the input() builtin which you already know, and that's about it. Mix it up with some loops, functions even classes if you want. I would show you an example but it depends on the program your making otherwise "use input()" is all the answer one can give.