第二节课:Python 操作文件 ——软件测试派

学习目标:掌握 python 操作文件

python 提供内置函数 open()实现对文件的操作。

python 对文本文件和二进制文件采用统一的操作步骤,和把大象放冰箱里的一样分三步,"打开-操作-关闭。"

728 x 2741812 x 682

open 函数

open(file, mode='r', encoding=None)

打开文件并返回对应的file object。如果该文件不能打开,则触发OSError。

file 包含文件名的字符串,可以是绝对路径,可以是相对路径。

mode 一个可选字符串,用于指定打开文件的模式。默认值r表示文本读。

encoding 文本模式下指定文件的字符编码

mode的取值:

字符意义

'r'文本读取(默认)

'w'文本写入,并先清空文件(慎用),文件不存在则创建

'x'文本写,排它性创建,如果文件已存在则失败

'a'文本写,如果文件存在则在末尾追加,不存在则创建

和mode组合的字符

字符意义

'b'二进制模式,例如:'rb'表示二进制读

't'文本模式(默认),例如:rt一般省略t

'+'读取与写入,例如:'r+' 表示同时读写

读文本文件

在当前目录下创建一个名为 test.txt 的文本文件,(注意编码方式)文件中写入下面的内容:

静夜思

床前明月光,疑是地上霜。

举头望明月,低头思故乡。

操作基本步骤

# 打开文件 mode=rt,t可以省略fb=open('test.txt','r',encoding='utf-8')# 读取content=fb.read()print(content)# 关闭文件fb.close()

上面这种操作经常会忘记关闭文件句柄,造成资源浪费,所以处理文件是往往使用with语句进行上下文管理。

withopen('test.txt','r',encoding='utf-8')asfb:content=fb.read()print(content)

with语句执行完毕会自动关闭文件句柄。

相对路径与绝对路径

进行文件处理时经常会碰到相对路径和绝对路径的问题。

绝对路径好理解,它指定了文件在电脑中的具体目录,以 windows 电脑为例:

d:\lemon\课件\python入门.md

相对路径一般是指相对当前脚本的路径,比如上面的案例中的test.txt应为和当前脚本在同一个文件夹下,所以可以直接使用test.txt作为文件名来操作。

也可显式的表达当前路径./test.txt,./表示当前目录。

../表示上级目录,同理../../表示上上级目录,依此类推。

那什么时候使用相对路径,什么时候使用绝对路径呢。

一般情况下项目本身的资源文件和脚本路径相对固定,为了不影响项目的移植性,必须使用相对路径。

如果需要读取操作系统中固定位置的系统文件一般使用绝对路径。

逐行读取

在读取文本文件时,经常需要按行读取,文件对象提供了多种方法进行按行读取。

readline

从文件中读取一行;如果 f.readline() 返回一个空的字符串,则表示已经到达了文件末尾

withopen('test.txt','r',encoding='utf-8')asfb:print(fb.readline())print(fb.readline())print(fb.readline())print(fb.readline())

readlines

以列表的形式返回文件中所有的行。

withopen('test.txt','r',encoding='utf-8')asfb:content=fb.readlines()print(content)

迭代

要从文件中读取行,还可以循环遍历文件对象。这是内存高效,快速的,并简化代码:

# 5星推荐withopen('test.txt','r',encoding='utf-8')asfb:forlineinfb:print(line)

读二进制文件

任何文件都可以以二进制读的方式打开,读取test.txt的二进制内容。

# mode=rb,不需要encoding参数withopen('test.txt','rb')asfb:content=fb.read()print(content)

# 也可以逐行读取,以\n换行符标志withopen('test.txt','rb')asfb:forlineinfb:print(line)

写文本文件

清除写w

案例:将锄禾这首诗写入 test.txt 文件中

# mode=w 没有文件就创建,有就清除内容,小心使用withopen('test.txt','w',encoding='utf-8')asfb:fb.write('锄禾\n')fb.write('锄禾日当午,汗滴禾下土;\n')fb.write('谁知盘中餐,粒粒皆辛苦。\n')

运行后会发现之前写有静夜思的 test.txt 内容修改为锄禾,因为w模式会清除原文件内容,所以小心使用。

追加写a

案例:将静夜思这首诗追加到 test.txt 文件中

# mode=a 追加到文件的最后withopen('test.txt','a',encoding='utf-8')asfb:fb.write('静夜思\n床前明月光,疑是地上霜;\n举头望明月,低头思故乡。\n')

排他写x

案例:在当前目录中创建文件 test.txt,存在则不创建

# mode=xtry:withopen('test.txt','x',encoding='utf-8')asfb:fb.write('')exceptExceptionase:print(e)

[Errno 17] File exists: 'test.txt'

写二进制文件

在写模式后加b即是写二进制模式,这种模式下写入内容为字节数据。

例如:将爬到的图片二进制信息写入文件中。

importrequestsurl='https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1247698508,1430079989&fm=26&gp=0.jpg'response=requests.get(url)withopen('校花.jpg','wb')asf:f.write(response.content)

读写文件

有时候需要能够同时读写文件,在模式后面加上+号即可给读模式添加写,给写模式添加读。

withopen('test.txt','r+',encoding='utf-8')asf:# 读文件print(f.read())f.write('草\n离离原上草,一岁一枯荣;\n野火烧不尽,春风吹又生!\n')

锄禾

锄禾日当午,汗滴禾下土;

谁知盘中餐,粒粒皆辛苦。

静夜思

床前明月光,疑是地上霜;

举头望明月,低头思故乡。

案例:python 处理解析 CSV 文件

# 读取csv文件并解析为嵌套列表data=[]withopen('鸢尾.csv','r',encoding='gbk')asf:forlineinf:# 去掉换行符line=line.strip()data.append(line.split(','))

data

[['id', '品种编号', '花瓣长', '花瓣宽', '花萼长', '花萼宽'],

['0', '0', '5.1', '3.5', '1.4', '0.2'],

['1', '0', '4.9', '3', '1.4', '0.2'],

['2', '0', '4.7', '3.2', '1.3', '0.2'],

['3', '0', '4.6', '3.1', '1.5', '0.2'],

['4', '0', '5', '3.6', '1.4', '0.2'],

['5', '0', '5.4', '3.9', '1.7', '0.4'],

['6', '0', '4.6', '3.4', '1.4', '0.3'],

['7', '0', '5', '3.4', '1.5', '0.2'],

['8', '0', '4.4', '2.9', '1.4', '0.2'],

['9', '0', '4.9', '3.1', '1.5', '0.1'],

['10', '0', '5.4', '3.7', '1.5', '0.2'],

['11', '0', '4.8', '3.4', '1.6', '0.2'],

['12', '0', '4.8', '3', '1.4', '0.1'],

['13', '0', '4.3', '3', '1.1', '0.1'],

['14', '0', '5.8', '4', '1.2', '0.2'],

['15', '0', '5.7', '4.4', '1.5', '0.4'],

['16', '0', '5.4', '3.9', '1.3', '0.4'],

['17', '0', '5.1', '3.5', '1.4', '0.3'],

['18', '0', '5.7', '3.8', '1.7', '0.3'],

['19', '0', '5.1', '3.8', '1.5', '0.3'],

['20', '0', '5.4', '3.4', '1.7', '0.2'],

['21', '0', '5.1', '3.7', '1.5', '0.4'],

['22', '0', '4.6', '3.6', '1', '0.2'],

['23', '0', '5.1', '3.3', '1.7', '0.5'],

['24', '0', '4.8', '3.4', '1.9', '0.2'],

['25', '0', '5', '3', '1.6', '0.2'],

['26', '0', '5', '3.4', '1.6', '0.4'],

['27', '0', '5.2', '3.5', '1.5', '0.2'],

['28', '0', '5.2', '3.4', '1.4', '0.2'],

['29', '0', '4.7', '3.2', '1.6', '0.2'],

['30', '0', '4.8', '3.1', '1.6', '0.2'],

['31', '0', '5.4', '3.4', '1.5', '0.4'],

['32', '0', '5.2', '4.1', '1.5', '0.1'],

['33', '0', '5.5', '4.2', '1.4', '0.2'],

['34', '0', '4.9', '3.1', '1.5', '0.1'],

['35', '0', '5', '3.2', '1.2', '0.2'],

['36', '0', '5.5', '3.5', '1.3', '0.2'],

['37', '0', '4.9', '3.1', '1.5', '0.1'],

['38', '0', '4.4', '3', '1.3', '0.2'],

['39', '0', '5.1', '3.4', '1.5', '0.2'],

['40', '0', '5', '3.5', '1.3', '0.3'],

['41', '0', '4.5', '2.3', '1.3', '0.3'],

['42', '0', '4.4', '3.2', '1.3', '0.2'],

['43', '0', '5', '3.5', '1.6', '0.6'],

['44', '0', '5.1', '3.8', '1.9', '0.4'],

['45', '0', '4.8', '3', '1.4', '0.3'],

['46', '0', '5.1', '3.8', '1.6', '0.2'],

['47', '0', '4.6', '3.2', '1.4', '0.2'],

['48', '0', '5.3', '3.7', '1.5', '0.2'],

['49', '0', '5', '3.3', '1.4', '0.2'],

['50', '1', '7', '3.2', '4.7', '1.4'],

['51', '1', '6.4', '3.2', '4.5', '1.5'],

['52', '1', '6.9', '3.1', '4.9', '1.5'],

['53', '1', '5.5', '2.3', '4', '1.3'],

['54', '1', '6.5', '2.8', '4.6', '1.5'],

['55', '1', '5.7', '2.8', '4.5', '1.3'],

['56', '1', '6.3', '3.3', '4.7', '1.6'],

['57', '1', '4.9', '2.4', '3.3', '1'],

['58', '1', '6.6', '2.9', '4.6', '1.3'],

['59', '1', '5.2', '2.7', '3.9', '1.4'],

['60', '1', '5', '2', '3.5', '1'],

['61', '1', '5.9', '3', '4.2', '1.5'],

['62', '1', '6', '2.2', '4', '1'],

['63', '1', '6.1', '2.9', '4.7', '1.4'],

['64', '1', '5.6', '2.9', '3.6', '1.3'],

['65', '1', '6.7', '3.1', '4.4', '1.4'],

['66', '1', '5.6', '3', '4.5', '1.5'],

['67', '1', '5.8', '2.7', '4.1', '1'],

['68', '1', '6.2', '2.2', '4.5', '1.5'],

['69', '1', '5.6', '2.5', '3.9', '1.1'],

['70', '1', '5.9', '3.2', '4.8', '1.8'],

['71', '1', '6.1', '2.8', '4', '1.3'],

['72', '1', '6.3', '2.5', '4.9', '1.5'],

['73', '1', '6.1', '2.8', '4.7', '1.2'],

['74', '1', '6.4', '2.9', '4.3', '1.3'],

['75', '1', '6.6', '3', '4.4', '1.4'],

['76', '1', '6.8', '2.8', '4.8', '1.4'],

['77', '1', '6.7', '3', '5', '1.7'],

['78', '1', '6', '2.9', '4.5', '1.5'],

['79', '1', '5.7', '2.6', '3.5', '1'],

['80', '1', '5.5', '2.4', '3.8', '1.1'],

['81', '1', '5.5', '2.4', '3.7', '1'],

['82', '1', '5.8', '2.7', '3.9', '1.2'],

['83', '1', '6', '2.7', '5.1', '1.6'],

['84', '1', '5.4', '3', '4.5', '1.5'],

['85', '1', '6', '3.4', '4.5', '1.6'],

['86', '1', '6.7', '3.1', '4.7', '1.5'],

['87', '1', '6.3', '2.3', '4.4', '1.3'],

['88', '1', '5.6', '3', '4.1', '1.3'],

['89', '1', '5.5', '2.5', '4', '1.3'],

['90', '1', '5.5', '2.6', '4.4', '1.2'],

['91', '1', '6.1', '3', '4.6', '1.4'],

['92', '1', '5.8', '2.6', '4', '1.2'],

['93', '1', '5', '2.3', '3.3', '1'],

['94', '1', '5.6', '2.7', '4.2', '1.3'],

['95', '1', '5.7', '3', '4.2', '1.2'],

['96', '1', '5.7', '2.9', '4.2', '1.3'],

['97', '1', '6.2', '2.9', '4.3', '1.3'],

['98', '1', '5.1', '2.5', '3', '1.1'],

['99', '1', '5.7', '2.8', '4.1', '1.3'],

['100', '2', '6.3', '3.3', '6', '2.5'],

['101', '2', '5.8', '2.7', '5.1', '1.9'],

['102', '2', '7.1', '3', '5.9', '2.1'],

['103', '2', '6.3', '2.9', '5.6', '1.8'],

['104', '2', '6.5', '3', '5.8', '2.2'],

['105', '2', '7.6', '3', '6.6', '2.1'],

['106', '2', '4.9', '2.5', '4.5', '1.7'],

['107', '2', '7.3', '2.9', '6.3', '1.8'],

['108', '2', '6.7', '2.5', '5.8', '1.8'],

['109', '2', '7.2', '3.6', '6.1', '2.5'],

['110', '2', '6.5', '3.2', '5.1', '2'],

['111', '2', '6.4', '2.7', '5.3', '1.9'],

['112', '2', '6.8', '3', '5.5', '2.1'],

['113', '2', '5.7', '2.5', '5', '2'],

['114', '2', '5.8', '2.8', '5.1', '2.4'],

['115', '2', '6.4', '3.2', '5.3', '2.3'],

['116', '2', '6.5', '3', '5.5', '1.8'],

['117', '2', '7.7', '3.8', '6.7', '2.2'],

['118', '2', '7.7', '2.6', '6.9', '2.3'],

['119', '2', '6', '2.2', '5', '1.5'],

['120', '2', '6.9', '3.2', '5.7', '2.3'],

['121', '2', '5.6', '2.8', '4.9', '2'],

['122', '2', '7.7', '2.8', '6.7', '2'],

['123', '2', '6.3', '2.7', '4.9', '1.8'],

['124', '2', '6.7', '3.3', '5.7', '2.1'],

['125', '2', '7.2', '3.2', '6', '1.8'],

['126', '2', '6.2', '2.8', '4.8', '1.8'],

['127', '2', '6.1', '3', '4.9', '1.8'],

['128', '2', '6.4', '2.8', '5.6', '2.1'],

['129', '2', '7.2', '3', '5.8', '1.6'],

['130', '2', '7.4', '2.8', '6.1', '1.9'],

['131', '2', '7.9', '3.8', '6.4', '2'],

['132', '2', '6.4', '2.8', '5.6', '2.2'],

['133', '2', '6.3', '2.8', '5.1', '1.5'],

['134', '2', '6.1', '2.6', '5.6', '1.4'],

['135', '2', '7.7', '3', '6.1', '2.3'],

['136', '2', '6.3', '3.4', '5.6', '2.4'],

['137', '2', '6.4', '3.1', '5.5', '1.8'],

['138', '2', '6', '3', '4.8', '1.8'],

['139', '2', '6.9', '3.1', '5.4', '2.1'],

['140', '2', '6.7', '3.1', '5.6', '2.4'],

['141', '2', '6.9', '3.1', '5.1', '2.3'],

['142', '2', '5.8', '2.7', '5.1', '1.9'],

['143', '2', '6.8', '3.2', '5.9', '2.3'],

['144', '2', '6.7', '3.3', '5.7', '2.5'],

['145', '2', '6.7', '3', '5.2', '2.3'],

['146', '2', '6.3', '2.5', '5', '1.9'],

['147', '2', '6.5', '3', '5.2', '2'],

['148', '2', '6.2', '3.4', '5.4', '2.3'],

['149', '2', '5.9', '3', '5.1', '1.8']]

# 将数据写为csv文件withopen('test.csv','w',encoding='utf-8')asf:foritemindata:f.write(','.join(item)+'\n')

文件指针

open 函数返回的文件对象使用文件指针来记录当前在文件中的位置。

read 方法

在读模式下,使用文件对象的 read 方法可以读取文件的内容。它接收一个整数参数表示读取内容的大小,文本模式下表示字符数量,二进制模式下表示字节大小。

withopen('test.txt','r',encoding='utf-8')asf:content=f.read(3)print(content)

content# '锄禾\n' 三个字符

withopen('test.txt','rb')asf:content=f.read(3)print(content)

'锄'.encode('utf-8')# 三个字节

当以读的方式打开文件后文件指针指向文件开头,执行 read 操作之后,根据读取的数据大小指针移动到对应的位置。

tell 方法

文件对象的 tell 方法返回整数,表示文件指针距离文件开头的字节数。

withopen('test.txt','r',encoding='utf-8')asf:print(f.tell())content=f.read(3)print(content)print(f.tell())

content.encode('utf-8')

r模式打开文件后文件指针指向文件开头,执行 read 操作之后,根据读取的数据大小指针移动到对应的位置。

withopen('test.txt','a',encoding='utf-8')asf:print(f.tell())

a模式打开文件后文件指针指向文件末尾。

seek 方法

通过文件对象的 seek 方法可以移动文件句柄

seek 方法接收两个参数:

offset 表示偏移指针的字节数

whence 表示偏移参考,默认为 0

0 表示偏移参考文件的开头,offset 必须是 >=0 的整数

1 表示偏移参考当前位置,offset 可以是负数

2 表示偏移参考文件的结尾,offset 一般是负数

注意文本模式下只允许从文件的开头进行偏移,也即只支持 whence=0

withopen('test.txt','r',encoding='utf-8')asf:print(f.read(3))# 跳转到文件开头f.seek(0)# 再读取第一个字print(f.read(1))

withopen('test.txt','rb')asf:# 读取文件最后的10字节f.seek(-10,2)print(f.read())

作者:877649301

链接:http://testingpai.com/article/1598431382507

来源:测试派

协议:CC BY-SA 4.0 https://creativecommons.org/licenses/by-sa/4.0/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335