2015-10-13 126 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