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

posted @ 2015-12-14 10:11  leo博客  阅读(3156)  评论(1)    收藏  举报