【问题标题】:Existing file not appending new record现有文件未追加新记录
【发布时间】:2018-04-08 11:02:52
【问题描述】:

我正在尝试创建一个文件作为标题,然后稍后打开它以附加新记录,但似乎我没有正确执行某些操作,有人知道吗?

下面是代码:

我试了好几种方法都无济于事。

file = 'Quizdata5.txt'
users = {}

def header():
    headers = ("USERID      LOGIN-NAME      SURNAME        NAME       AGE  "
               "       YEAR-GROUP     SEX    USERNAME\n")
    with open(file, 'w') as file1:
        file1 .write(headers)
        file1.close()

def newUser():
    global users
    global header
    global createLogin
    global createPassw
    global surname
    global name
    global  age
    global  y_group
    global  sex
    global z1

    createLogin = input("Create login name: ")
    if createLogin in users: # check if login name exists
        print("\nLogin name already exist, please choose a different name!\n")
    else:
        createPassw = input("Create password: ")
        users[createLogin] = createPassw # add login and password
    #return (users[createLogin])
    surname = input("Pls enter your surname: ")
    name = input("Pls enter ur name: ")
    age = input("Pls enter your age: ")
    y_group = int(input("Please enter your year group: "))
    sex =input("Please enter your sex: ")
    print("\nUser created!\n")
    print("*********************************")
    print(" Your Name is\t" + name, "and it starts with: " + name[0] + "\n")
    z1 = createPassw[:3] + age
    print(" Your Username is:\t ", z1)

if __name__ =='__main__':
    header()
    while newUser():
        with open(file, 'a') as file2:
            rows = ("{:8}    {:8}        {:8}        {:8}       {:8}    {:8}"
                    "     {:8}      {:8} \n".format(createLogin, createPassw,
                                                    surname, name, age,
                                                    y_group, sex, z1))
             file2.write(rows.split())
        file2.close()
        #enter code here

【问题讨论】:

  • 请修正您的代码格式。
  • 嗨,格蕾丝。我认为最好将代码分解成更小的部分。从一小部分开始,对其进行测试和修复,直到它起作用,然后进入下一个小部分。试图一次解决所有这些问题并不好。剪切和粘贴测试时,您的代码格式不起作用。
  • 错误是什么?有错误吗?
  • 没有错误,运行流畅,只是不会将新的行记录追加到现有的头文件中

标签: python file append


【解决方案1】:

下面的工作版本。请注意,我将您的 input 语句更改为 raw_input。我正在使用 Python 2.7。主要需要:

  1. 选择退出外部 AND 内部 while 循环
  2. 为现有用户建立一个列表以检查现有用户名
  3. 修复行格式
  4. 写行时不要拆分行

现在似乎可以正常工作并准备好进行更多改进。构建一点并测试直到工作,然后构建更多 - 节省大量时间!

file = 'Quizdata5.txt'
users = {}

def header():
    headers = "USERID    LOGIN-NAME    SURNAME    NAME    AGE    YEAR-GROUP    SEX    USERNAME\n"
    with open(file, 'r') as file1:
        firstLine = file1.readline()
        print firstLine
        if firstLine == headers:
            print 'Headers present'
            return
    with open(file, 'w') as file1:
            file1.write(headers)

def newUser():
    userList = []

    with open(file, 'r') as file1:
        Lines = file1.readlines()
        for line in Lines[1:]:
            lineArray = line.split('    ')
            userList.append(lineArray[0])
        print userList

    global users
    global header
    global createLogin
    global createPassw 
    global surname 
    global name
    global  age
    global  y_group
    global  sex
    global z1

    createLogin = raw_input("Create login name or enter 'exit' to quit: ")
    if createLogin == 'exit':
        return False

    while createLogin in userList: # check if login name exists
        print("\nLogin name already exist, please choose a different name!\n")
        createLogin = raw_input("Create login name or enter 'exit' to quit: ")
        createLogin = createLogin.strip()
        if createLogin == 'exit':
            print('Goodbye for now.')
            return False
    createPassw = raw_input("Create password: ")
    users[createLogin] = createPassw # add login and password
    # return (users[createLogin])
    surname = raw_input("Pls enter your surname: ")
    name = raw_input("Pls enter ur name: ")
    age = raw_input("Pls enter your age: ")
    y_group = int(raw_input("Please enter your year group: "))
    sex = raw_input("Please enter your sex: ")
    print("\nUser created!\n") 
    print("*********************************")
    print(" Your Name is\t" + name, "and it starts with: " + name[0] + "\n")
    z1 = createPassw[:3] + age
    print(" Your Username is:\t ", z1)
    return True

if __name__ =='__main__':
    header()    
    while newUser() == True:
        with open(file, 'a') as file2:
            row ="{a}    {b}    {c}    {d}    {e}    {f}    {g}    {h}\n".format(
                    a=createLogin, b=createPassw, c=surname, d=name, e=age, f=y_group, g=sex, h=z1)
            file2.write(row)

【讨论】:

  • 嗨 Thom Ives 非常感谢,该解决方案运行良好,但问题是,每次我运行该程序时,它都会删除现有文件并创建一个新文件。有没有办法永久创建一次标题列并为每次新运行附加新行。其次,出口不起作用。在我以前的代码中,我尝试过退出,但也没有用。如果你不介意我可以给你整个原件和其他模块代码,这样你就知道你是否知道替代路线
  • 卫生署!我需要自己测试更多。把它分解成小块。我留下了一些用于故障排除的打印语句。立即尝试。
  • 非常感谢汤姆,我还没有测试过,但它看起来像真的。读取现有文件以确认是否已经存在标题的想法非常重要。非常感谢
  • 太棒了。考虑创建一个类来保存它。它会让你的代码……“更优雅”。随着时间的推移,努力寻找重构它的方法。
  • 是的,我会的,但是你对 python 字典有什么想法
【解决方案2】:

不只是彻底重写你的代码,你的问题是行

while newUser():

这意味着调用newUser(),并且newUser()的返回值(评估为布尔值)返回True时执行缩进代码。那是bool(newUser()) is True

现在问题是

a) newUser() 返回什么, b) bool() 是什么意思?

第一个 b:Python 中的所有对象都有一些与之关联的“布尔”值,TrueFalse。对于许多内置类型,它们的布尔评估是有意义的。例如,整数0 在布尔上下文中被视为False,而任何非零整数都被视为True。在大多数编程语言中都是这种情况,但也有一些例外。

类似地,一个空列表[] 在布尔上下文中是False(这就是为什么我们可以编写if not my_list: ... 之类的东西来测试列表是否为空),而任何非空列表都被视为True等等。

至于:

您的 newUser() 函数没有显式返回 和任何 结果,因为您没有 return 语句(Tom 的解决方案添加了一些)。您要做的是在添加新用户时返回 True-ish 值,在不添加新用户时返回 False-ish 值。但由于你不返回任何东西,事实上,如果 Python 函数的默认返回值,如果你没有明确地return,是一个名为None 的值,它始终是False

所以最终结果是您的while 语句下的代码永远不会运行。

如果您对自己的代码在做什么有疑问,请使用pdb 逐行查看它在做什么——返回的函数和分配给变量的值。调试器(谷歌会快速引导你到一些好的教程)。特别是对于 Python,没有理由对您的代码实际在做什么一无所知。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多