如何确认变量是否在csv文件中?

时间:2017-10-03 17:59:22

标签: python csv variables if-statement

运行代码并到达csv文件部分时出现此错误: 第96行,在字段名中 self._fieldnames = next(self.reader) io.UnsupportedOperation:阅读

我的代码:

import csv
username = ""
global enteruser
global username

def user():
    age  = input("What is your age:")
    year = input("What is your year group?")
    name = input("What is your name?")
    username = name+age+year
    return username

def username_validator():
    with open('usernames.csv', 'ab') as file:
        reader = csv.DictReader(file)
        for row in reader:
            print(row)
            if  enteruser or username == row["usernames"]: # if the username shall be on column 3 (-> index 2)
                print ("is in file")
                with open("user1.csv","ab") as quiz:
                    quizreader = csv.DictReader(quiz,delimiter=",")
                    for row in quizreader:
                        print(row["name"])
            else:
                print("doesnt work")

isuser = input("Do you have a username?")
if isuser == ("yes" or "Yes"):
    enteruser = input("Enter username:")
    username_validator()
elif isuser == ("no" or "No"):
   user()
else:
    None

print(username)  

2 个答案:

答案 0 :(得分:0)

不确定这是否是导致您出现问题的原因,但请务必在此处小心使用全局变量。由于您的代码现在已经存在,它将始终在最后一行打印一个空字符串,因为您永远不会全局更新username。根据经验,尽可能避免使用全局变量,而是将这些变量作为参数传递给函数。

除非您明确告诉您的函数使用全局变量,否则它将默认为创建局部变量。所以这里:

def user():
    age  = input("What is your age:")
    year = input("What is your year group?")
    name = input("What is your name?")
    username = name+age+year
    return username 

我们实际上没有对全局变量username做任何事情,而是简单地在返回的函数中创建一个新的局部变量。要更新全局变量,请在函数中将其定义为全局变量(如下所示):

def user():
    global username
    age  = input("What is your age:")
    year = input("What is your year group?")
    name = input("What is your name?")
    username = name+age+year

或者,保持函数不变,只需在调用user()函数时更新变量,如下所示:

elif isuser == ("no" or "No"):
   username=user()
else:
    None

print(username)  

编辑:仔细查看你的if语句,阅读OP中的评论中发布的链接。

答案 1 :(得分:0)

您的错误是由文件打开/关闭引起的。

您正试图从未打开的文件中读取。

从内置函数open function开始的python中有一个声明如下:

    open(name[, mode[, buffering]])

这里你可以使用的参数是r:reading,w:writing,a:追加r +:读/写,w +:读/写,以及a +:追加/写模式。对于这些,二进制标签可以像r + b

一样添加到最后

对于您的代码,您需要更改

中的开放行
    with open("user1.csv","ab") as quiz:

    with open('user1.csv', 'a+b') as quiz:

所以你真正需要的是+允许追加和阅读