欢迎关注公众号 学习资料不会少

文件处理

在我们做自动化测试的过程中,常常会将数据文件存放在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万+软件测试人员都在学的精品课程免费送,大家别错过

c++怎么可以在二进制文件中读取带string的数据_文件处理 | csv文件读写相关推荐

  1. 编写程序:构造如下文档内容 姓名:邀请您来参加本次会议 李雷 其中,姓名从文件 names.txt 中读取,共 3 个,产生的输出文件为 3 个,输出文件名为对应的 姓名,txt如 张三.txt

    3. 编写程序:构造如下文档内容姓名:邀请您来参加本次会议李雷其中,姓名从文件 names.txt 中读取,共 3 个,产生的输出文件为 3 个,输出文件名为对应的 姓名,txt, 如 张三.txt. ...

  2. EasyExcel在项目中的应用-在web中导出带下拉框和批注的excel文件

    前言 ​ 好长一段时间没有更新博客了,最近刚刚找到实习工作,接触了企业中的项目,在这段时间的实习过程中,终于知道了企业级项目的体量和业务难度跟之前的小项目是完全不同的.10多天的适应期也逐渐让我找到了 ...

  3. pandas读取前几行数据_使用实现pandas读取csv文件指定的前几行

    下面为大家分享一篇使用实现pandas读取csv文件指定的前几行,具有很好的参考价值,希望对大家有所帮助.一起过来看看吧 用于存储数据的csv文件有时候数据量是十分庞大的,然而我们有时候并不需要全部的 ...

  4. 【Python--数据结构分析】海伦一直使用在线交友网站寻找适合的交友对象,为了方便分析,她将交友数据存放在datingTestSet.csv文件中。

    import numpy as np import pandas as pd from pandas import Series,DataFrame #1.创建50*7的DataFrame对象,数据为 ...

  5. 「实战教程」如何使用POI读取模板PPT填充数据并拼接至目标文件

    文章目录 一.PPT文件格式介绍 1.PPT文件格式的概述 2.HSLF和XSLF的区别 3.如何选择合适的POI类库 二.SlideShow 三.读取PPT文件 1. 加载PPT文件 2. 获取PP ...

  6. php 根据一个数据组的id 取得另一个数据组对应的名称,怎样从两个spss的数据文件中选出id相同的数据,合并成一个文件...

    求教高手怎样从两个spss的数据文件中选出id相同的数据,合并成一个文件.谢谢.排序后用merge file操作,怎么原数据没有变化?output中提示这些 Renaming has created ...

  7. python两个csv表数据合并_python – 根据列中的数据合并两个CSV文件

    我有两个csv文件,如下所示. CSV1 data13 data23 d main_data1;main_data2 data13 data23 data12 data22 d main_data1; ...

  8. 练习:selenium 爬取京东的电脑商品100页的数据并保存到csv文件中

    练习:selenium 爬取京东的电脑商品100页的数据并保存到csv文件中 from selenium.webdriver import Chrome, ChromeOptions import t ...

  9. 在QT中结构体快速从二进制文件中读取数据

    这可能是一个比较基础的问题,但由于刚开始学习c++,但是对我来说,结构体快速从二进制文件读取数据,给我解决了很大的问题,这里我把方法写出来,和有需要的人分享一下,高手看到了请多包涵. 我的二进制文件是 ...

最新文章

  1. 数据分析师必看:5大概率分布,你了解多少?
  2. springboot 防重复 提交
  3. ORA-07445导致实例崩溃的解决【The solution of instance crush by ORA-07445】
  4. 6、MySQL查看和修改事务隔离级别
  5. 合肥学院计算机原理,合肥学院计算机组成原理实验三-20210415130709.docx-原创力文档...
  6. npoi 所有列调整为一页_必能用到,一页PPT中想放超多图片怎么办?
  7. Java:使用Mockito模拟ResultSet
  8. MFC利用控制台输出调试信息的方法
  9. 【入门5】字符串(今天刷洛谷了嘛)
  10. 技工学校计算机类论文,技工学校计算机教学论文
  11. sphinx java_把 sphinx 官方提供的 java api 添加到 maven 库
  12. 好的数据分析平台有多重要
  13. Python爬取新浪英超曼联文章内页--bs4,json,txt和csv以及编码
  14. 读书笔记 | 4.3 基于征信系统的征信基础产品
  15. IO操作(Java版)
  16. webpack打包提示: The following entrypoint(s) combined asset size exceeds the recommended limit
  17. 5-ipv6基础知识之-域名解析dns
  18. php gbk转拼音
  19. python领域语言教案_第一单元 走进Python 编程世界
  20. python time模块以秒计时保留两位小数,格式化时间戳

热门文章

  1. C# 根据空格数截取
  2. Elasticsearch+Mongo亿级别数据导入及查询实践
  3. Linux 安装DenyHost防止ssh被暴力破解
  4. prepareStatement的用法和解释
  5. 基于直接最小二乘的椭圆拟合(Direct Least Squares Fitting of Ellipses)
  6. asp.net 母版页使用方法
  7. .NET框架怎样解决DLL Hell问题?
  8. 识别你的ADFS是什么版本的(Which version of ADFS is running)
  9. UITableView性能优化 - 中级篇
  10. Android 模块化编程之引用本地的aar