手把手教你学python2第七讲(文件)

如果图片出不来请到https://www.bilibili.com/read/cv254612,都是本人写的


说几个快捷键Ctrl+]集体向右缩进一个Tab,Ctrl+[集体向左缩进一个Tab,用法就是选中然后就可以操作,如果你用MATLAB,Ctrl+r,集体注释,Ctrl+y,集体取消注释。Tab其实还可以智能的给你一些你想要的输入,比如你输入

按TAB,如果你前面打的已经可以确定内置方法,就会直接变成

确定不了会给你一个列表,你可以按上下选择,再按Tab键确定你需要的内置方法。还有一个shift+enter智能换行,其实shift+enter在word里有直接产生一个新的空白页的作用哦。

这一讲我们来讲解与文件相关的操作

打开文件我们用到open函数,我们来来看一下帮助(很长,选了一些重要的展示在下面)

我们重点看前两个参数,第一个是路径,第二个是打开模式。下面是各种模式



'w'模式打开文件会比较危险,容易导致以前的内容丢失,因此在使用'w'模式打开文件前检查该文件名是否存在就显得很重要。因此,最好用'x'更安全。

默认是以只读文本形式’rt’打开。下面我们介绍读文件。

读文件的一系列操作

首先我们要介绍文件指针,它就像你读实体书的时候压着书的那只手或者书签,标示着当前位置,你读到哪里它就在哪里,想从头再读就需要把文件指针重新指向文本的首。我们来试着打开一个txt文件。笔者事先在D盘创建了一个read.txt,里面内容在下面


没错笔者就是这么穷,笔记本电脑用的是好几年前亲戚上完大学不用的,还是酷睿i3的呢。

你们就不能给我投点币吗?我现在电脑上最多能用python3.4,投点币让我换台电脑,可以给你们讲最新版本的python,手动滑稽。言归正传

我们来尝试读取一下

注意文件路径如果你用\注意加一个\转义,也可以直接用/或者在前面加一个r,都可以。

但是怎么没有读取出来呢?我们看到a是一个文件io包装类型,这个类型笔者也不是很懂,但是,a也就是个对象而已,要想读文本内容我们需要用内置方法,知道这些就够了

先说close

然后是read()

尼后面还有,但是如果全部截过来字太小,就截了一部分

我们看到a.read()一次以后再a.read()读出来的是一个空的字符串,这是因为此时文件指针已经指向了末尾,再渎当然什么都读不出来了。这时我们就需要seek来帮我们把文件指针移动回文章的开始。然后才能读出来东西。

seek(0,0)就是回到文章开始,然后括号里是字符是,不是字节数,我们还看到\n也被计入为一个字符。我们还看到seek返回了一个数字,那个数字是字节数,这里需要说明如果打开方式是'r',seek里的两个参数至少有一个为0,不然会报错。(感觉很奇葩,也许高版本的python不一样)

而且seek第一个参数偏移量必须合理。因为txt按照GBK进行编码,一个汉字2个字节,英文标点一个字节,否则在读的时候会报错

3是中的一半,读的时候没办法读,就会报错。下一个是tell,它没有参数,返回的是当前文件指针的位置,是字节数

readline上面写的难理解,在这里就是读一行,如果不给参数或者给负整数参数,就读一行,给正整数参数的话就和read一样读字符,readline(0)返回空字符串,而且它的参数只有一个

笔者再介绍一个上面没有的readlines,它只有一个参数,默认是0,不给参数或者给负整数参数的话,就和read()一样读全文,给正整数参数,就和readline()一样读一行。

write和writelines在'r'模式下是会发生io异常的

异常会专门有一讲去讲的。

list这两个可以把字符串按行转化为列表,但是需要注意list(a)把当前文件指针以后的内容变成了列表,而且这一过程相当于读文件,我们可以看到list(a)结束,文件指针指在文章末尾,并且再一次list(a)就变成了空列表

按照原文的格式打印出来可以这样

python更推荐的一种更有效率的做法是不用转化成列表,我们看到for操作也是移动了文件指针的,不移动根本没办法读到相应的内容

直接转化直接用read也可以

我们来试下用‘b’打开文件

我们看出来,其实seek方法返回的就是tell也就是当前文本指针离文章开始的位置,数字是字节数。并且seek方法可以从当前文本指针位置开始偏移量非0定位,也就是两个参数都不是0。read括号里的参数十六进制数的个数,也就是双字节的个数。

写文件

我们用'x'来写文件,因为它安全,如果创建一个相同名字的文件不会覆盖原来的文件

我们来试下

果然会报错。下面我们创建一个新的文件

write方法返回的是输入字符的个数。我们到D盘去看看

这个txt是有的,但是字节是0,这是为什么?因为我们没有close

close之后我们再去看

双击进入

把前面两次写的内容都写进去了。我们来试试'a'

看到writelines是可以写进去序列的,但是元素必须是字符串类型。。write方法是不能写序列的。在写情况下,读也是不被允许的。我们打开write.txt看看

确实写进去了,注意必须先close才能存进硬盘,不然还在python缓冲期里,一断电就悲剧。

下面再补充几点



我们看到集合和字典也可以当作writelines的参数,字典不加内置方法默认是keys进去,尽管它们不是序列,因为它们是无序的,并且我不知道为什么集合和字典进去的时候都是2在前,1在后,应该是个哈希存储有关系。我还试了


我们看到two还是在one前,哈希存储不太懂,不好解释,如果有人懂,请在评论区指教。

可读可写

其实就是用‘+’模式


为什么刚开始read是空呢?因为是在'a'下,我们到的是文本的末尾,所以是0,seek方法回到文章开始时,我们就可以读到内容了。另外我还试了

奇葩的又来了,只有在含有‘b’的模式下,seek方法两个参数可以都不是0,其它模式都会报错。而且我们可以看到在GBK编码里英文字母和空格都是占一个字节。我们来看下标点符号占字节情况

我们看到字母在中文输入情况下也是一个字节,中文标点两个字节,英文标点一个字节。

通用换行符问题


图片内容摘自https://www.zhihu.com/question/19751023

一些对文本的练习

0下面让我们结合前面学过的内容来完成下面这么一件事

将下面文本中两段对话分开,=======分隔的是不同的对话,并且把小王和小李的话分别保存在小王1.txt,小王2.txt和小李1.txt,小李2.txt里。明白了题意的话就先请大家先思考一下再看答案。





2请设计程序,接受用户的输入并保存,以'end'字符作为结尾,

3编写一个程序,用户输入文件名和要求显示的行数


4将下面文件中‘’松冈出现个数打印出来,并且将’松冈’全部替换为'我'。





答案在这里

0笔者发现前面对split的介绍不够详细,在这里补充一下

split方法有两个参数,第一个参数如果不给,默认是空格作为分隔符,而且空的字符会被移除。第二个参数不给或者给负整数参数就按照分隔符把整个字符串分隔,给正整数参数就是设置最大分隔次数。返回的是一个列表。




上面我们看到没给参数的时候,用空格分割,并且多余的空格都会被删除,如果没给参数并且原字符串没有空格,那么就直接不分割,直接用单元素列表返回字符串。如果给定参数,那么就以给定的字符串分隔,不按照字符串分隔,空格也不会被删除。第二个参数是最大分隔次数,肯定都必须是整数。看到上面给1就只分隔一次,给两次就最多分隔两次,注意是最多,如果只能分隔一次,那就分隔一次。

下面就是0题的解答:

上面wh=lh=[]会出问题,因为这是深拷贝,还有一个疑问,

没有写路径

会导致下面的结果,首先我们看到文件是产生了,没有输入路径的话,文件生成在编程用的test0.py这个文件夹里了。

但是文件内容怎么样呢?

这是因为wh和lh指向一个存储空间,用append当然都小李和小王的话都加进去了。正确的做法

用浅拷贝或者分别赋值都是可以的,这提醒我们,不可以随便使用深拷贝,两个变量初始值可能一样,但是它们的内容都在变,把它们指向同一个地方可能会出现问题。

结果正确

1

它们和python文件在同一个文件夹,创建一个文件很简单

建文件的原因和MATLAB用edit一样,便于修改,因为笔者用的python Shell(IDLE)是写完一段代码就执行,前面执行过的代码不能修改和MATLAB里的命令窗口一样。

最后还是关闭文件

我们看到python是区分大小写的。

2



3




4








评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值