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

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

文件处理

在我们做自动化测试的过程中,常常会将数据文件存放在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 项目中进行安装

6679108832a54d2a9094ef923d9e66f4.png

02

写入文件

下面代码将会快速创建Excel文件

from openpyxl import Workbook

workbook = Workbook()

sheet = workbook.active

sheet["A1"] = "hello"

sheet["B1"] = "world!"

workbook.save(filename="hello_world.xlsx")

生成文件内容

f78bf808c9d3f5a910824625607a1e02.png

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', ...)

b19057cd05185fcdaef62976d8b65b23.png

往期精彩文章

喜报来了!凡猫学员薪资最高16K!

金融行业软件测试介绍

2020年为什么大家都开始学习自动化测试?

学习测试开发前 你需要掌握的python 代码水平

1万+软件测试人员都在学的精品课程免费送,大家别错过

86c718c45eb07911a0b5db6e0fe60898.gif
相关资源:jdk-8u281-windows-x64.exe
已标记关键词 清除标记
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质? 你是否想成为一名资深开发人员,想开发别人做不了的高性能程序? 你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹?   那么C++就是你个人能力提升,职业之路进阶的不二之选。 【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。 2.你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。 3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。 【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署; 2.吊打一切关于C++的笔试面试题; 3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。 【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块 基础篇 本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。 进阶篇 本篇主要讲解编程常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。 提升篇: 本篇可以帮助学员更加高效的进行c++开发,其包含类型转换、文件操作、异常处理、代码重用等内容。
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页