博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pythoning——9:python文件操作
阅读量:6694 次
发布时间:2019-06-25

本文共 2261 字,大约阅读时间需要 7 分钟。

字面意思,文件操作,无非就是找到文件,打开文件,写入/删除文件,找不到文件就去创建文件,并没有什么特殊的。如果你是这么认为的,那就太天真了,在python中提供了更为合理的数据管理方式。并非是你想像中的那么简单。

首先是打开文件,打开文件需要调用open函数,提供文件名,及打开方式。打开方式有(默认为r):

r:     只读模式w:     只写模式a:     追加模式(从文件结尾追加)r+:    读写模式w+:   读写模式(会先清空,后写入,然后读取,写读更合理吧)a+:    读写模式(还是只会从结尾处追加)rb:    二进制只读模式wb:    二进制只写模式ab:    二进制追加模式rb+:   二进制读写模式wb+:   二进制读写模式ab+:   二进制读写模式

读取文件

通过读模式打开文件后,可以对文件中的内容进行读取操作。

以test.txt文本为例,内容如下:

1 fukuda2 jingyuz3 music4 doit
test.txt

下面介绍几种常用的文件读取方式

首先是读取文件中的所有内容read()

>>> f = open('test.txt')

>>> a = f.read()
>>> print(a)
1 fukuda
2 jingyuz
3 music
4 doit
>>> type(a)
<class 'str'>
>>> a
'1 fukuda\n2 jingyuz\n3 music\n4 doit'
>>> f.close()

这种读取方式,将文件中的所有的数据都会加载到内存中,文件小还好说,文件大的话就惨了,有可能会造成死机的说,别问我为什么会知道。而且这个函数会将所有的文本内容全部赋给一个字符串变量,对,想像一个场景,一个容量为几十个G的字符串。

刚接触python的时候学习的第一个读取函数是readlines(),同样会读取文件中所有的内容,但是会按行划分为列表。

>>> f = open('test.txt','r')>>> a = f.readlines()>>> type(a)
>>> print (a)['1 fukuda\n', '2 jingyuz\n', '3 music\n', '4 doit']>>> f.close()

但是通过这种方式同样会面临读取大文件内存不足的问题,python提供了readline()函数,可以逐行阅读。

>>> f = open('test.txt','r')>>> a = f.readline()>>> while a:...     print (a,end="")...     a = f.readline()...1 fukuda2 jingyuz3 music4 doit >>>f.close()

是的,感觉操作特别复杂,而且效率并不会特别高。据官方介绍,自python2.5版本以后,文本流采用了可迭代的方式,即你可以用for循环的方式遍历文本流,而不用担心内存不足什么的。

>>> f = open('test.txt','r')>>> for line in f:...     print(line,end="")...1 fukuda2 jingyuz3 music4 doit

有时通过以上的读取方式可能会出现乱码什么的,这是由于文件编码方式不同的原因。可以通过二进制方式打开文件(open('test.txt','rb'))或者直接在打开文件是规定enconding为哪种编码方式(open('test.txt','r',encoding='utf-8'))。

写文件

可以通过写模式进行写文件操作,这里需要注意几点,w会先清空原有的文本文件,然后再在上面写操作,a只会在原有文件上面进行追加操作,r+则会在指定位置处覆盖内容的写方式。写的操作通常都是调用date.write(str)的方式写入文件流。下面以r+操作test.txt文件为例

第一行第二行第三行第四行
test.txt
>>> f = open('test.txt','r+')>>> f.readline()>>> b = f.tell()>>> f.seek(b)8>>> f.write("第五行\n")4>>> f.close()

而此时test.txt文件则变为:

第一行第五行第三行第四行
test.txt

这里简单介绍了文件的写操作,上面用到了两个陌生函数tell和seek,这两个函数在不能用鼠标来定位自己想到达的位置的python代码里,是很重要的操作文本文件的函数。

首先tell用来获取当前读操作的位置,返回值为当前位置的长度(字节码)什么的,seek则是定位想要去的位置,然后到那里去,进行读写操作,二者结合使用。

另外python还为文件操作提供一些其他的功能:

f.flush() 将缓存区的内容写入硬盘

f.next()返回下一行,并将文件操作标记位移到下一行。把一个file用于for ... in file这样的语句时,就是调用next()函数来实现遍历的。 

f.seekable()查看节点是否可以被定位。

f.writable()查看文件是否可写

f.truncate()截断指针位置之后的数据,与seek结合使用

转载于:https://www.cnblogs.com/fukuda/p/5550405.html

你可能感兴趣的文章
转:网站架构-从无到有
查看>>
MUI的一些笔记
查看>>
Jenkins可持续集成Python自动化脚本
查看>>
Linux系统起源及主流发行版
查看>>
跨域问题、跨域cookie问题
查看>>
smarty获取php中的变量
查看>>
linux中wget 、apt-get、yum rpm区别
查看>>
关于Hogan的学习笔记
查看>>
coredump功能介绍
查看>>
Linux内核学习第五周 系统调用
查看>>
第三天,小作业,表达式,while循环
查看>>
HTML5编写规范
查看>>
restful+springmvc+mybatis+ webservice 分布式架构
查看>>
ios语音识别
查看>>
discuz 门户页模板中的keywords和description不能正常显示
查看>>
sqlserver视图内容语句从系统表中从获取
查看>>
SQL Server 2012附加数据库时,错误提示如下:尝试打开或创建物理时,CREATE FILE 遇到操作系统错误 5(拒绝访问。)...
查看>>
解决报错“超时时间已到。超时时间已到,但是尚未从池中获取连接”的方案...
查看>>
Scrapy 爬虫框架入门
查看>>
pl/sql编程(十五)
查看>>