2015-10-13 130 views
-1

我在.csv文件中有一些信息。我希望能够检查文件是否具有特定的代码。关闭csv文件的I/O操作

这是我下面的代码:

import csv 
with open('bezoekerscode.csv', 'r') as f: 
    reader = csv.reader(f) 


def code_control(): 
    code = str(input('Type hier uw code in die u wilt controleren:\n')) 
    if code in reader: 
     print('code komt overheen, en wordt nu gecheckt of de aanbieder wel correct is.') 
     f.close() 
    else: 
     print('deze code komt niet overheen.') 
     f.close() 

code_control() 

我应该出来的有两种情况:

  • 码是否一致

  • 码不匹配
+0

这里有两个问题:首先,您错误地使用了'with',它会在上下文结束时关闭'f'',而使'csv.reader'没有一个有效的输入文件。其次,你错误地使用'csv.reader',它会给你*行的项目,而不是直接的项目;你必须检查'code'是否在任何行,否则你检查它是否等于*任何行。 – MisterMiyagi

回答

1

你可以利用这一事实,在Python空列表[]作为Falseif子句计算的优势:

if [line for line in reader.readlines() if code in line.strip()]: 
    # if code doesn't match a line, it will return [] ergo false 
    # and else is going to get executed. 
else: 
    # Do else stuff. 

通常你想你的with open声明移入功能了。之后,with会自动关闭您的文件。您的代码将是看起来像这样更好:

import csv 

def code_control(): 
    with open('bezoekerscode.csv', 'r') as f: 
     reader = csv.reader(f) 
     code = str(input('Type hier uw code in die u wilt controleren:\n')) 
     if [line for line in reader.readlines() if code in line.strip()]:: 
      print('code komt overheen, en wordt nu gecheckt of de aanbieder wel correct is.') 
    else: 
     print('deze code komt niet overheen.') 

code_control() 

注意,你不能在一个封闭的文件进行操作。要评估文件是否仍处于打开状态,可以检查其属性file.closed

1

与您的代码的问题是,你正在使用code_control函数内读者变量,但变量是背景在当地。

你可以在全球任何声明,或将其作为参数传递给code_control功能,例如:)

import csv 

def code_control(reader): 
    code = str(input('Type hier uw code in die u wilt controleren:\n')) 
    if code in reader: 
     print('code komt overheen, en wordt nu gecheckt of de aanbieder wel correct is.') 
    else: 
     print('deze code komt niet overheen.') 

with open('bezoekerscode.csv', 'r') as f: 
    reader = csv.reader(f) 
    code_control(reader) 

而且你并不真的需要f.close(因为上下文管理器使用的是通过处理已经。

+0

谢谢,这工作!但是,我们有一个包含一些代码信息的.csv文件。其中一个单元格有一个代码(例如“A44”)。当我在阅读器中尝试“if”a44“时,它表示它无法找到代码 – Cake

+0

**阅读器**不是上下文本地化的 - 上下文没有自己的范围,但上下文将关闭* * f **在结尾,这打破了读者(因为它需要一个*打开*文件) – MisterMiyagi

+0

谢谢@MisterMiyagi,我不知道上下文没有自己的范围,在这种情况下,它表现为一个局部变量,所以我认为它是,但似乎我必须做更多的阅读。 – primero