欢迎关注公众号 学习资料不会少
文件处理
在我们做自动化测试的过程中,常常会将数据文件存放在csv或者Excel文件里边。这一章节内容将给大家介绍,如何使用python进行csv和Excel文件的处理
open文件读写
open(file, mode='r', buffering=-1,
encoding=None, errors=None, newline=None,
closefd=True, opener=None)
open() 返回一个 file object,最常用的有两个参数:open(filename, mode)。
最常用的方式:
>>> f = open('workfile', 'w')
第一个参数是包含文件名的字符串(输入文件名或者文件路径)。
第二个参数是另一个字符串,其中包含一些描述文件使用方式的字符。
mode 表示文件的权限,主要有如下参数
'r' ,表示文件只能读取;
'w' 表示只能写入(已存在的同名文件会被删除);
'a' 表示打开文件以追加内容,任何写入的数据会自动添加到文件的末尾;
'r+' 表示打开文件进行读写。mode 参数是可选的;省略时默认为 'r';
通常文件是以 text mode 打开的,这意味着从文件中读取或写入字符串时,都会以指定的编码方式进行编码。如果未指定编码格式,默认值与平台相关 (参见 open())。在mode 中追加的 'b' 则以 binary mode 打开文件:现在数据是以字节对象的形式进行读写的。这个模式应该用于所有不包含文本的文件。
在文本模式下读取时,默认会把平台特定的行结束符 (Unix 上的 \n, Windows 上的 \r\n) 转换为 \n。在文本模式下写入时,默认会把出现的 \n 转换回平台特定的结束符。这样在幕后修改文件数据对文本文件来说没有问题,但是会破坏二进制数据例如 JPEG 或 EXE 文件中的数据。请一定要注意在读写此类文件时应使用二进制模式。
字符 | 含义 |
“r” | 读取(默认) |
“w” | 写入,并截断文件 |
“x” | 排它性创建,如果文件已存在则失败 |
“a” | 写入,如果文件存在则在末尾追加 |
“b” | 二进制模式 |
“t” | 文本模式(默认) |
“+” | 更新磁盘文件(读取并写入) |
在处理文件对象时,最好使用 with 关键字。优点是当子句体结束后文件会正确关闭,即使在某个时刻引发了异常。而且使用 with 相比等效的 try-finally 代码块要简短得多:
>>> with open('workfile') as f:
... read_data = f.read()
>>> f.closed
True
如果你没有使用 with 关键字,那么你应该调用 f.close() 来关闭文件并立即释放它使用的所有系统资源。如果你没有显式地关闭文件,Python的垃圾回收器最终将销毁该对象并为你关闭打开的文件,但这个文件可能会保持打开状态一段时间。另外一个风险是不同的Python实现会在不同的时间进行清理。
通过 with 语句或者调用 f.close() 关闭文件对象后,尝试使用该文件对象将自动失败。:
>>> f.close()
>>> f.read()
Traceback (most recent call last):
File "", line 1, in
ValueError: I/O operation on closed file.
01文件对象的方法
本节中剩下的例子将假定你已创建名为 f 的文件对象。
要读取文件内容,请调用 f.read(size),它会读取一些数据并将其作为字符串(在文本模式下)或字节串对象(在二进制模式下)返回。size 是一个可选的数值参数。当 size 被省略或者为负数时,将读取并返回整个文件的内容;如果文件的大小是你的机器内存的两倍就会出现问题。当取其他值时,将读取并返回至多 size 个字符(在文本模式下)或 size 个字节(在二进制模式下)。如果已到达文件末尾,f.read() 将返回一个空字符串 ('')。
>>> f.read()'
This is the entire file.\n'
>>> f.read()
''
f.readline() 从文件中读取一行;换行符(\n)留在字符串的末尾,如果文件不以换行符结尾,则在文件的最后一行省略。这使得返回值明确无误;如果 f.readline() 返回一个空的字符串,则表示已经到达了文件末尾,而空行使用 '\n' 表示,该字符串只包含一个换行符。:
>>> f.readline()
'This is the first line of the file.\n'
>>> f.readline()
'Second line of the file\n'
>>> f.readline()
''
要从文件中读取行,你可以循环遍历文件对象。这是内存高效,快速的,并简化代码:
>>> for line in f:
... print(line, end='')
...
This is the first line of the file.
Second line of the file
如果你想以列表的形式读取文件中的所有行,你也可以使用 list(f) 或 f.readlines()。
f.write(string) 会把 string 的内容写入到文件中,并返回写入的字符数。:
>>> f.write('This is a test\n')
15
在写入其他类型的对象之前,需要先把它们转化为字符串(在文本模式下)或者字节对象(在二进制模式下):
>>> value = ('the answer', 42)
>>> s = str(value) # convert the tuple to string
>>> f.write(s)
18
f.tell() 返回一个整数,给出文件对象在文件中的当前位置,表示为二进制模式下时从文件开始的字节数,以及文本模式下的意义不明的数字。
要改变文件对象的位置,请使用 f.seek(offset, whence)。通过向一个参考点添加 offset 来计算位置;参考点由 whence 参数指定。whence 的 0 值表示从文件开头起算,1 表示使用当前文件位置,2 表示使用文件末尾作为参考点。whence 如果省略则默认值为 0,即使用文件开头作为参考点。
>>> f = open('workfile', 'rb+')
>>> f.write(b'0123456789abcdef')
16
>>> f.seek(5) # Go to the 6th byte in the file
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2) # Go to the 3rd byte before the end
13
>>> f.read(1)
b'd'
在文本文件(那些在模式字符串中没有 b 的打开的文件)中,只允许相对于文件开头搜索(使用 seek(0, 2) 搜索到文件末尾是个例外)并且唯一有效的 offset 值是那些能从 f.tell() 中返回的或者是零。其他 offset 值都会产生未定义的行为。
csv文件读写
CSV (Comma Separated Vaules) 格式是电子表格和数据库中最常见的输入、输出文件格式。能够跨平台,在自动化测试过程中常用来存储数据。
csv 模块中的 reader 类和 writer 类可用于读写序列化的数据。
也可使用 DictReader 类和 DictWriter 类以字典的形式读写数据。
01读取文件
csv.reader(csvfile, dialect='excel', **fmtparams)
返回一个 reader 对象,该对象将逐行遍历 csvfile。csvfile 可以是任何对象,如果 csvfile 是文件对象,则打开它时应使用 newline=''。下面看一个简单的例子
data.csv 文件内容:
username,age
xiaoming,10
xiaohong,20
import csv
# 1.打开文件
with open('./data.csv') as f:
read = csv.reader(f) # csv 模块读数据
for line in read: # 循环里面的每一条数据
print(line)
执行代码,输出
['username', 'age']
['xiaoming', '10']
['xiaohong', '20']
02
写入文件
csv.writer(csvfile, dialect='excel', **fmtparams)
返回一个 writer 对象,该对象负责将用户的数据在给定的文件类对象上转换为带分隔符的字符串。csvfile 可以是具有 write() 方法的任何对象。如果 csvfile 是文件对象,则打开它时应使用 newline=''。
import csv
with open('./data2.csv',mode='w',newline='', encoding='
utf8') as f:
writer = csv.writer(f)
for x in range(10):
writer.writerow(['欢迎','来凡猫',"学习自动化"]) #写入1行
03
字典类型数据保存到CSV文件
class csv.DictWriter(f, fieldnames, restval='',
extrasaction='raise', dialect='excel', *args,
**kwds)
创建一个对象,该对象在操作上类似常规 writer,但能将字典映射到输出行。fieldnames 参数是由 key(键)组成的 序列,用于指定字典中的 value (值)的顺序,这些值会按指定顺序传递给 writerow() 方法并写入 f 文件。如果字典缺少 fieldnames 中的键,则可选参数 restval 用于指定要写入的值。如果传递给 writerow() 方法的字典的某些键在 fieldnames 中找不到,则可选参数 extrasaction 用于指定要执行的操作。如果将其设置为 'raise' (默认值),则会引发 ValueError。如果将其设置为 'ignore',则字典中的其他键值将被忽略。所有其他可选或关键字参数都传递给底层的 writer 实例。
注意,与 DictReader 类不同,DictWriter 类的 fieldnames 参数不是可选参数。
一个简单的例子:
import csv
with open('names.csv', 'w', newline='') as csvfile:
fieldnames = ['first_name', 'last_name']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'first_name': 'Baked', 'last_name':
'Beans'})
writer.writerow({'first_name': 'Lovely', 'last_name':
'Spam'})
writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})
04
读取csv文件返回字典类型数据
class csv.DictReader(f, fieldnames=None,
restkey=None, restval=None, dialect='excel',
*args, **kwds)
创建一个对象,其操作类似于常规 reader 但会将每行中的信息映射到一个 OrderedDict,其中的键由可选的 fieldnames 形参给出。
例子
>>> import csv
>>> with open('names.csv', newline='') as csvfile:
... reader = csv.DictReader(csvfile)
... for row in reader:
... print(row['first_name'], row['last_name'])
...
Eric Idle
John Cleese
>>> print(row)
OrderedDict([('first_name', 'John'), ('last_name', 'Cleese')])
使用openpyxl进行excel文件读写
01安装openpyxl
命令行安装
$ pip install openpyxl
在pycharm 项目中进行安装

02
写入文件
下面代码将会快速创建Excel文件
from openpyxl import Workbook
workbook = Workbook()
sheet = workbook.active
sheet["A1"] = "hello"
sheet["B1"] = "world!"
workbook.save(filename="hello_world.xlsx")
生成文件内容

03
读取文件
使用openpyxl中 load_workbook 类加载文件
from openpyxl import load_workbook
# 加载Excel文件
wb = load_workbook('./hello_world.xlsx')
# 获取所有sheet工作区
wts = wb.worksheets
print(wts)
# 获取默认Sheet
ws = wb.active
# sheet 标题
print(ws.title)
# A1 单元格的值
print(ws['A1'].value)
# 通过指定行,列输出单元格的值
print(ws.cell(row=1,column=1).value)
输出结果
[]
Sheet
hello
hello
04
多个单元格数据
上面读取Excel数据文件时,通过指定单元格获取值,在实际应用场景中,往往一个Excel文件中有许多单元格文件,下面介绍如何获取多行数据。
>>> sheet["A1:C2"]
((, , ),
(, , ))
You can get ranges of rows or columns:
>>>
>>> # Get all cells from column A
>>> sheet["A"]
(,
,
...
,
)
>>> # Get all cells for a range of columns
>>> sheet["A:B"]
((,
,
...
,
),
(,
,
...
,
))
>>> # Get all cells from row 5
>>> sheet[5]
(,
,
...
,
)
>>> # Get all cells for a range of rows
>>> sheet[5:6]
((,
,
...
,
),
(,
,
...
,
))
● .iter_rows() 迭代行
● .iter_cols() 迭代列
主要参数:
● min_row
● max_row
● min_col
● max_col
>>> for row in sheet.iter_rows(min_row=1,
... max_row=2,
... min_col=1,
... max_col=3):
... print(row)
(, , )
(, , )
>>> for column in sheet.iter_cols(min_row=1,
... max_row=2,
... min_col=1,
... max_col=3):
... print(column)
(, )
(, )
(, )
values_only 参数获取值
>>> for value in sheet.iter_rows(min_row=1,
... max_row=2,
... min_col=1,
... max_col=3,
... values_only=True):
... print(value)
('marketplace', 'customer_id', 'review_id')
('US', 3653882, 'R3O9SGZBVQBV76')
sheet.rows 获取sheet表格中行数
>>> for row in sheet.rows:
... print(row)
(, ,
...
, , )
获取单元格的值
>>> for value in sheet.iter_rows(min_row=1,
... max_row=1,
... values_only=True):
... print(value)
('marketplace', 'customer_id', 'review_id', 'product_id', ...)
往期精彩文章
喜报来了!凡猫学员薪资最高16K!
金融行业软件测试介绍
2020年为什么大家都开始学习自动化测试?
学习测试开发前 你需要掌握的python 代码水平
1万+软件测试人员都在学的精品课程免费送,大家别错过
