如果图片出不来请到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