Selenium参数化:读取CSV文件
概述
从Selenium模块化一文中,可以看出参数化的必要性,本文来介绍下读取外部CSV文件的方法。
读取CSV文件
假如,现在要读取数据,包括用户名、邮箱、年龄、性别等信息。这个时候再用txt存储数据就不是很方便直观了。下面通过读取csv 文件的方法来存储数据。
首先创建csv文件,通过WPS 表格或Excel 创建表格,文件另存为选择CSV 格式进行保存,注意不要直接修改Excel 的后缀名来创建CSV 文件,这样创建出来的并非真正的CSV 文件,文件存储内容如下:
|
admin |
admin123!@# |
|
guest |
guest123!@# |
|
test |
test123!@# |
Python中有专门的CSV模块,用于处理csv文件的读写操作,本文主要介绍两个函数的读取操作
CSV.Reader
先了解下csv.reader介绍,reader(csvfile[, dialect='excel'][, fmtparam])
csvfile
需要是支持迭代(Iterator)的对象,并且每次调用next方法的返回值是字符串(string),通常的文件(file)对象,或者列表(list)对象都是适用的,如果是文件对象,打开是需要加"b"标志参数
dialect
编码风格,默认为excel方式,也就是逗号(,)分隔,另外csv模块也支持excel-tab风格,也就是制表符(tab)分隔。其它的方式需要自己 定义,然后可以调用register_dialect方法来注册,以及
list_dialects方法来查询已注册的所有编码风格列表
fmtparam
格式化参数,用来覆盖之前dialect对象指定的编码风格。
下面通过该函数来读取上文的Excel文件内容,如下:
#coding:utf-8 import codecs import csv def csv_reader(address):#读取csv文件 f=open(address,'rb') users=[] pwds=[] csvs=csv.reader(f) for data in csvs: name=data[0] pwd=data[1] users.append(name) pwds.append(pwd) return users,pwds f.close() def show_list(lists):#打印列表 for list in lists: data=list print "%s(len:%d)" %(data,len(data))
通过上述两个函数功能的调用,则可以打开对应的csv文件,并打印文件内容,其执行结果如下:
------用户名------ admin(len:5) guest(len:5) test(len:4) ------密码------ admin123!@#(len:11) guest123!@#(len:11) test123!@#(len:10)
那如果文档中的用户名为中文,是否可运行通过呢?修改源文件为下表:
|
管理员 |
admin123!@# |
|
来宾 |
guest123!@# |
|
测试人员 |
test123!@# |
运行后,结果如下:
------用户名------ ����Ա(len:6) ����(len:4) ������Ա(len:8) ------密码------ Centerm123!@#(len:13) guest123!@#(len:11) test123!@#(len:10)
那么如何才能解决乱码问题呢?这个问题与之前txt文档读取乱码问题相同,是因为内容解码错误导致的,这里修改show_list(lists)代码如下:
... def show_list(lists):#打印列表 for list in lists: data=list.decode('gb18030')#解决乱码问题 print "%s(len:%d)" %(data,len(data)) ...
运行结果如右图:
------用户名------ 管理员(len:3) 来宾(len:2) 测试人员(len:4) ------密码------ admin123!@#(len:11) guest123!@#(len:11) test123!@#(len:10)
CSV.DicReader
csv.DictReader(csvfile, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)
同reader差不多,都是读取CSV用的,只不过会生成一个字典(dict)类型的返回,而不是迭代类型。
Filednames是字段名参数,是一个序列,其元素与CSV存储的数据的字段相关。这些元素成为字典的键。如果省略字段名参数, CSV文件的第一行中的值将用作字段名。
如果读取的文件的字段数多余定义的字段名,则其余的列以list的形式,作为restkey的值保存;
如果读取某些字段名序列没有数据,则统一使用restval参数的值保存。
下面示例,通过csv.DicReader来读取内容为英文的CSV文件:
#coding:utf-8 import codecs import csv def dic_reader_csv(address):#读取csv文件 my_address=address dic=csv.DictReader(file(my_address,'rb'),fieldnames=['name','pwd' ]) return dic def show_dic(dics):#打印dic内容 for dic in dics: list=dic.keys() print dic for i in list: my_key=i my_value=dic[i] print"%s(len%d):%s(len%d)" %(my_key,len(my_key),my_value,len(my_value))
运行结果如下:
{'pwd': 'admin123!@#', 'name': 'admin'}
pwd(len3):admin!@#(len11)
name(len4):admin(len5)
{'pwd': 'guest123!@#', 'name': 'guest'}
pwd(len3):guest123!@#(len11)
name(len4):guest(len5)
{'pwd': 'test123!@#', 'name': 'test'}
pwd(len3):test123!@#(len10)
name(len4):test(len4)
同样,如果读取内容中包含有中文的CSV文件时,结果会存在乱码,这里同样修改show_dic(dics)代码如下:
... def show_dic(dics):#打印dic内容 for dic in dics: list=dic.keys() print dic for i in list: my_key=i.decode('gb18030')#解决中文乱码问题 my_value=dic[i].decode('gb18030')#解决中文乱码问题 print"%s(len%d):%s(len%d)" %(my_key,len(my_key),my_value,len(my_value))
运行结果如下:
{'pwd': 'Centerm123!@#', 'name': '\xb9\xdc\xc0\xed\xd4\xb1'}
pwd(len3):admin123!@#(len11)
name(len4):管理员(len3)
{'pwd': 'guest123!@#', 'name': '\xc0\xb4\xb1\xf6'}
pwd(len3):guest123!@#(len11)
name(len4):来宾(len2)
{'pwd': 'test123!@#', 'name': '\xb2\xe2\xca\xd4\xc8\xcb\xd4\xb1'}
pwd(len3):test123!@#(len10)
name(len4):测试人员(len4)
另外,因为本章演示的CSV文档均没有定义字段名,而如果使用DicReader的话,可以去除如下代码中fileldnames的参数,而在CSV文件中的第一行为每一列定义字段名即可。
dic=csv.DictReader(file(my_address,'rb'),fieldnames=['name','pwd' ])
参考资料
举例说明Python的CSV模块
http://www.cnblogs.com/sislcb/archive/2008/12/15/1355481.html
Python标准库
http://python.usyiyi.cn/python_278/library/csv.html#csv.excel

浙公网安备 33010602011771号