检查CSV文件中的多个字符串

时间:2017-08-08 19:45:05

标签: python csv

这似乎是一个简单的问题,但我现在无法弄明白。我有以下CSV文件:

Version,4
Name,Jon
Address,Somewhere
Date,09-16-2016
Worked,Yes
Done,No
Description,Something

我想检查此CSV是否包含A列中的多个字段,并包含B列中的相关值。

我的代码看起来像这样:

import csv
f = csv.reader(open(file.csv))
fields = ['Name','Address','Date']

现在,如果找到字段和/或相关值,我想做一些特定的逻辑,例如:

for r in f:
    if r[0] in fields:
        print(r[0]+" is present in the file.csv file")
        if r[1]:
            print("Value related to "+r[0]+" is in the file.csv file")
            if r[0] == 'Date': 
                if type(datetime.datetime.strptime(r[1], '%m-%d-%Y')) == datetime.datetime:
                    print(r[0]+" value is correctly formatted")
                else:
                    print(r[0]+" value is not correctly formatted (MM-DD-YYYY)")
                    break
        else:
            print("Value related to "+r[0]+" is not filled in, in the file.csv file")
            break

这有效,但我现在如何检查fields列表中的任何字符串是否在此循环中不在CSV中?任何其他言论也是受欢迎的。

2 个答案:

答案 0 :(得分:1)

如果您愿意给pandas一个go ::

,这将很简单
>>> import pandas as pd
>>> df = pd.read_csv('file.csv', header=None, names=['A', 'B'])
>>> df
             A           B
0      Version           4
1         Name         Jon
2      Address   Somewhere
3         Date  09-16-2016
4       Worked         Yes
5         Done          No
6  Description   Something

>>> fields = ['Name','Address','Date']
>>> df.ix[:, 'C'] = df['A'].isin(fields)
>>> df
             A           B      C
0      Version           4  False
1         Name         Jon   True
2      Address   Somewhere   True
3         Date  09-16-2016   True
4       Worked         Yes  False
5         Done          No  False
6  Description   Something  False

或者,您可以尝试::

>>> import csv
... f = csv.reader(open('file.csv'))
... fields = ['Name','Address','Date']
... 
... 
>>> items = dict(f)
>>> items
{'Name': 'Jon', 'Version': '4', 'Done': 'No', 'Address': 'Somewhere', 'Date': '09-16-2016', 'Worked': 'Yes', 'Description': 'Something'}
>>> defined_keys = {k: v for k, v in items.items() if k in fields}
>>> defined_keys
{'Date': '09-16-2016', 'Name': 'Jon', 'Address': 'Somewhere'}
>>> undefined_keys = {k: v for k, v in items.items() if k not in fields}
>>> undefined_keys
{'Worked': 'Yes', 'Version': '4', 'Done': 'No', 'Description': 'Something'}
>>> 

这里正确的数据结构取决于您打算对数据执行的所有流程/操作。 DataFrame在这方面非常灵活,但如果您愿意自己推广,那么此处的dict可能就行了。

答案 1 :(得分:1)

对于标准库方法,可能类似于:

import csv
import datetime

reader = csv.reader(open('file.csv'))
file_contents = {}
for line in reader:
    file_contents[line[0]] = line[1]

def is_date(s):
    return isinstance(datetime.datetime.strptime(s, '%m-%d-%Y'), datetime.datetime)

fields = [('Name',lambda s: isinstance(s,str)),
          ('Address',lambda s: isinstance(s,str)),
          ('Date',is_date)]
for field,arg_check in fields:
    if field not in file_contents:
        print('Missing field {}'.format(field))
        break
    val = file_contents[field]
    if not arg_check(val):
        print('field {} with value {} failed arg check'.format(field,val))
        break

这里我盲目地将所有csv值读入字典,然后有一个元组列表来指定预期的内容。 fields指定字段名称后跟一个函数,该函数在使用该字段的值作为其参数调用时返回True或False。