【问题标题】:How to read it as a list?如何将其作为列表阅读?
【发布时间】:2018-01-07 19:28:14
【问题描述】:

我需要扫描代码中的第二项以检查其正确性,但返回此错误:

Traceback (most recent call last):
  File "C:/Users/oscar/Documents/ff.py", line 29, in <module>
    with open(account) as f:
TypeError: expected str, bytes or os.PathLike object, not list

代码:

step = str(input("do you have an account? (reply with yes or no)"))

if step == ("no"):
    username = input("what do you want your username to be?")
    password = input("what do you want your password to be?")
    favgenre = input("what is your favourite genre?")
    favartist = input("who is your favourite artist?")
    account = open("%s.txt" %username, "w+")
    account.write(username)
    account.write(",")
    account.write(password)

    account.write(",")
    account.write(favgenre)
    account.write(",")
    account.write(favartist)
    account.write(",")
    account.close()

if step == ("yes"):
    username = input("please enter username")
    password = input("please enter your password")
    account = open("%s.txt" %username, "a+")
    account = [account]
    filename = (username)

    if username == username:
        with open(account) as f:
            strings = f.readlines()
            data = [string.split() for string in strings]
            print(data[1])

【问题讨论】:

  • 如果您的帐户是文件路径列表作为字符串,您需要做for filepath in accounts: with open(filepath) as f
  • 这一行:account = open("%s.txt" %username, "a+") 已经在变量account 中“放置”了一个打开的文件。然后你把打开的文件对象放在一个列表中并尝试再次打开它。
  • 那么解决办法是什么
  • 我尝试了 for filepath 的东西,但为此不得不删除“with open(account) as f:”

标签: python string list error-handling


【解决方案1】:

我会使用pickle 模块来保存数据,而不是为每个用户创建单独的文件,而是将它们全部保存在字典中并保存。

这就是我的意思:

import pickle

# First read any existing database into memory.
#
database_filename = 'user_db.pkl'
db_updated = False  # Flag indicating database needs to rewritten.
# Read the existing database if any, otherwise create an empty version.
try:
    with open(database_filename, 'rb') as infile:
        database = pickle.load(infile)
except FileNotFoundError:
    database = {}
    db_updated = True

# Then interact with user or do other operations to it.
#
step = str(input("Do you have an account (yes or no)? "))

if step == "no":
    username = input("What do you want your username to be? ")
    password = input("What do you want your password to be? ")
    favgenre = input("What is your favourite genre? ")
    favartist = input("Who is your favourite artist? ")

    data = [password, favgenre, favartist]
    database[username] = data
    db_updated = True

elif step == "yes":
    username = input("Please enter your username: ")
    if username not in database:
        print('Error: username {!r} not found in database'.format(username))
    else:
        password = input("OK, please enter your password: ")

        data = database.get(username)
        if data[0] != password:
            print('Error: password does not match')
            del data
        else:
            print('username {!r} found, data: {}'.format(username, data))

else:
    print('Please enter "yes" or "no"')

if db_updated:
    with open(database_filename, 'wb') as outfile:
        pickle.dump(database, outfile, pickle.HIGHEST_PROTOCOL)
        print('Database file updated')

在我的answer 问题Saving an Object (Data persistence) 中还有关于pickle 的信息。

【讨论】:

    猜你喜欢
    • 2013-02-28
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多