昨天改bug改了一下午,一个很简单的细节,却很容易被忽视,特记录一下。
在用python读取csv数据时,如果想判断某一个字段是否有值,可以写成:
reader = csv.Dicteader(inputFile)
tmp_lst = []
for row in reader:
if row.get('xxx):
tmp_list.append(row['xxx'])
这样写,如果是多线程调用服务并接受返回值的话,可能会引起很大的问题,例如
#将调服务的返回值加到输入中
def cpAttr(e={}, ne={}):
try:
for k, v in ne.items():
e[k] = v.encode('utf-8')
except Exception as ex:
pass
#线程调用的函数
def handle(data_list, thread_name):
p = []
for e in data_list:
if e.get('a') :
p.append(e['a'])
ps = {'splits': p}
data = json.dumps(ps)
url = "xxx"
req = urllib2.Request(url=url, data=data, headers=headers)
response = urllib2.urlopen(req)
resp = response.read()
results = json.loads(resp)
for i in range(len(data_list)):
cpAttr(data_list[i], results[i])
如果这里用 if dict.get(‘x’)来判断字典是否有值,就会有问题,因为如果这一字段是空值就不会被加入到请求的json中,也就是说请求长度跟原始输入长度不一致,就会导致输出结果全部错乱,所以这里应该写成:
def handle(data_list, thread_name):
p = []
for e in data_list:
#要判断不为空值
if e.get('a') is not None :
p.append(e['a'])
ps = {'splits': p}
data = json.dumps(ps)
url = "xxx"
req = urllib2.Request(url=url, data=data, headers=headers)
response = urllib2.urlopen(req)
resp = response.read()
results = json.loads(resp)
for i in range(len(data_list)):
cpAttr(data_list[i], results[i])
ps. python的csv模块可能有内部的优化,如果只单独读一列并且有空值并按照错误的写法不会报错,而是会自动把一行全为空的自动删除掉。