这似乎是一个简单的问题,但我现在无法弄明白。我有以下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中?任何其他言论也是受欢迎的。
答案 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。