2015-08-24 3 views
0

Я новичок в Python и наткнулся на ошибку. Я пытаюсь создать программу, которая будет использовать имя пользователя и пароль, сделанные пользователем, записать их в списки и записать эти списки в файлы. Вот некоторые из моего кода: Это та часть, где пользователь создает имя пользователя &.Как вы пишете список в файл в Python?

userName=input('Please enter a username') 

password=input('Please enter a password') 

password2=input('Please re-enter your password') 

if password==password2: 

    print('Your passwords match.') 

while password!=password2: 

    password2=input('Sorry. Your passwords did not match. Please try again') 

    if password==password2: 

     print('Your passwords match') 

Мой код работает отлично до этого момента, когда я получаю сообщение об ошибке:

invalid file: <_io.TextIOWrapper name='usernameList.txt' mode='wt' encoding='cp1252'>.

я не уверен, почему возвращается эта ошибка.

if password==password2: 
    usernames=[] 
    usernameFile=open('usernameList.txt', 'wt') 
    with open(usernameFile, 'wb') as f: 
     pickle.dump(usernames,f) 
    userNames.append(userName) 
    usernameFile.close() 
    passwords=[] 
    passwordFile=open('passwordList.txt', 'wt') 
    with open(passwordFile, 'wb') as f: 
     pickle.dump(passwords,f) 

    passwords.append(password) 
    passwordFile.close() 

Есть ли способ исправить ошибку или другой способ записать списки в файл? Благодаря

+1

возможно дубликат [Python: Написали список в файл] (http://stackoverflow.com/questions/899103/python-write-a-list-to-a-file) – Andy

+0

Кроме того, ваш только повторная попытка 'password2'. Что делать, если пользователь набрал пароль '1' неправильно? – muddyfish

+1

Вы открываете файл одновременно в двух режимах 'wt' и' wb', я думаю, 'wb' является обязательным здесь. – ZdaR

ответ

1

У вас была правильная идея, но было несколько проблем. Когда пользовательские пароли не совпадают, вы обычно запрашиваете их снова.

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

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

import pickle 

userName = input('Please enter a username: ') 

while True: 
    password1 = input('Please enter a password: ') 
    password2 = input('Please re-enter your password: ') 

    if password1 == password2: 
     print('Your passwords match.') 
     break 
    else: 
     print('Sorry. Your passwords did not match. Please try again') 

user_names = [] 
user_names.append(userName) 

with open('usernameList.txt', 'wb') as f_username: 
    pickle.dump(user_names, f_username) 

passwords = [] 
passwords.append(password1) 

with open('passwordList.txt', 'wb') as f_password: 
    pickle.dump(passwords, f_password) 
1
usernameFile=open('usernameList.txt', 'wt') 
with open(usernameFile, 'wb') as f: 

Во второй строке usernameFile является объектный файл. Первый аргумент для открытия должен быть быть именем файла (io.open() также поддерживает номера дескрипторов файлов как int). open() пытается принудить свой аргумент к строке.

В вашем случае, это приводит к

str(usernameFile) == '<_io.TextIOWrapper name='usernameList.txt' mode='wt' encoding='cp1252'>' 

, который не является допустимым именем файла.

Заменить

with open('usernameList.txt', 'wt') as f: 

и избавиться от usernameFile полностью.

+0

Спасибо за ответ :) Однако теперь я столкнулся с именем NameError: name 'pickle' не определено ' – Davina

+0

@Davina Это новый вопрос. Также как подсказка для будущих вопросов: при столкновении с такими ошибками всегда целесообразно публиковать полную трассировку стека, поскольку в ней содержится ссылка на строку кода, вызывающую проблему в первую очередь. – dhke

Смежные вопросы