1. 文件操作介绍

说到操作文件我们肯定会想到流,文件的操作都是通过流来操作的。在python中文件的操作非常简单,并不像Java等其他语言一样有各种各样的流操作,我们直接使用open函数即可打开一个文件,然后进行各种操作,但是根据打开的不同的方式所能够执行的操作也不一样,打开文件的方式有:r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b 等等。

下面我们先看一个读取的文件操作:

In [2]: f = open(file='a.txt', mode='r', encoding='utf-8')

In [3]: f.read()
Out[3]: '每天坚持一点,\n每天努力一点,\n每天多思考一点,\n慢慢你会发现,\n你的进步越来越大\n' In [4]:

使用open函数打开文件,并且返回一个文件对象,open函数常见的几个参数file(要操作的文件名),mode(以什么模式打开)和encoding(指定一种编码来读取文件),根据不同的mode模式,返回的文件会有各种不同的操作。下面我们来看一下文件的几种操作。

2. 文件操作的几种方式

(1)只读操作

只读操作只需指定mode为r即可:

In [5]: f = open(file='a.txt', mode='r', encoding='utf-8')

In [6]: f.read()
Out[6]: '每天坚持一点,\n每天努力一点,\n每天多思考一点,\n慢慢你会发现,\n你的进步越来越大\n' In [7]: f.readable() # 判断文件是否可读
Out[7]: True In [8]: f.writable() # 判断文件是否可写
Out[8]: False # 此处是以只读模式打开的文件,所以返回False不可写 In [9]: f1 = open(file='单分支结构.eddx', mode='rb') # 使用‘rb’可以打开存储为二进制的数据,图片、视频等 In [10]: f1.read(20)
Out[10]: b'PK\x03\x04\x14\x00\x08\x00\x08\x00mN\xe3H\xa9\x95\xb3\x9eW\x01'

(2)只写操作

mode='w'


In [13]: f = open(file='a.txt', mode='w', encoding='utf-8') In [14]: f.read() # 此时尝试读取文件会报错
---------------------------------------------------------------------------
UnsupportedOperation Traceback (most recent call last)
<ipython-input-14-571e9fb02258> in <module>
----> 1 f.read() UnsupportedOperation: not readable In [15]: f.write('葫芦娃')
Out[15]: 3 In [16]: f.close() In [17]: !cat a.txt # 此时查看文件之前那的内容已经被覆盖了
葫芦娃
In [18]:

使用mode='w'操作文件时首先会在打开文件时先清空文件,然后再根据操作把内容写入文件,只读模式有以下特点:

  • 当文件不存在时,会自动创建文件,然后打开文件进行操作
  • 打开文件时会先清空文件的内容,然后再从头开始写入
  • 文件以只写模式打开,不能够读取

(3)追加操作

mode='a'

In [18]: f = open(file='a.txt', mode='a', encoding='utf-8')

In [19]: f.write('每天坚持一点,\n每天努力一点,\n每天多思考一点,\n慢慢你会发现,\n你的进步越来越大\n')
Out[19]: 42 In [20]: f.close() In [21]: In [21]: !cat a.txt
葫芦娃每天坚持一点,
每天努力一点,
每天多思考一点,
慢慢你会发现,
你的进步越来越大 In [22]:

追加模式的操作:

  • 打开文件时如果文件不存时会先创建文件
  • 往文件中写入内容时都是在文件末尾写入,不论光标在哪
  • 打开的文件只能写入,不能读取

(4)r+模式

r+模式是加强的读操作,即可以读写:

In [22]: f = open(file='a.txt', mode='r+', encoding='utf-8')

In [23]: f.readable()
Out[23]: True In [24]: f.writable()
Out[24]: True In [25]: f.read()
Out[25]: '葫芦娃每天坚持一点,\n每天努力一点,\n每天多思考一点,\n慢慢你会发现,\n你的进步越来越大\n' In [26]: f.write('\n哈哈哈哈哈哈哈')
Out[26]: 8 In [27]: f.close() In [28]: !cat a.txt # 查看写入的文件并没有异常
葫芦娃每天坚持一点,
每天努力一点,
每天多思考一点,
慢慢你会发现,
你的进步越来越大 哈哈哈哈哈哈哈
In [29]: f = open(file='a.txt', mode='r+', encoding='utf-8') In [30]: f.seek(0, 2) # seek可以调整光标位置
Out[30]: 153 In [31]: f.write('你的进步越来越大')
Out[31]: 8 In [32]: f.read() # 先写后读会读出空字符
Out[32]: '' In [33]:

总结:增强型的读操作对文件可读可写,但是顺序必须是先读取在往里面写入,如果先读再写入再读取的时候可能会读取到空字符串

r+模式深坑请注意: 在r+模式下. 如果读取了内容. 不论读取内容多少. 光标显⽰的是多少. 再写入或者操作⽂件的时候都是在结尾进⾏的操作

(5)w+和a+模式

w+模式和a+模式在实际使用场景较少,这边简单介绍一下:

  • w+:增强型的w模式,可以写和读操作,但是也跟r+一样,如果先读操作再写操作的话会有坑出现,并且每次在打开文件是会先清空文件,因此使用场景较少
  • a+:增强型的a模式,也可以进行读写操作,但是写入时只能往文件的末尾写入,无论光标怎么移动,都只能在文件末尾写入

3. 文件的操作的方法

(1)文件的读取和写入

文件的写入:主要是write方法以及writelines方法

  • write方法:直接写入字符串即可,上面的例子中也有用到
  • writelines方法:传递的参数必须时可迭代的(如列表和元组等)

文件的读取

  • read方法:read方法接收一个int型的参数,表示一次读取几个字符(seek的单位是字节),不提供默认是读取文件所有内容
  • readline方法:读取文件一行,文件很大时这个方法很使用,不会一次读取整个文件
  • readlines方法:读取出整个文件,以每一行分割存放到一个列表里并返回这个列表
In [34]: f = open(file='a.txt', mode='r', encoding='utf-8')
# 葫芦娃每天坚持一点,
# 每天努力一点,
# 每天多思考一点,
# 慢慢你会发现,
# 你的进步越来越大 # 哈哈哈哈哈哈哈你的进步越来越大
In [35]: f.read(10) # 这里时一次读取10个字符
Out[35]: '葫芦娃每天坚持一点,' In [36]: f.readline()
Out[36]: '\n' In [37]: f.readline() # 每次读取一行
Out[37]: '每天努力一点,\n' In [38]: f.readlines() # 返回的是一个列表
Out[38]: ['每天多思考一点,\n', '慢慢你会发现,\n', '你的进步越来越大\n', '\n', '哈哈哈哈哈哈哈你的进步越来越大'] In [39]:

readline(文件句柄)和readlines的区别

  • 文件句柄是一个可迭代对象,在循环遍历时每遍历一次取一行,不会在读取文件时一次性全部读出来
  • readlines返回的结果是一个列表,会一次性把整个文件的内容读取出来并返回一个列表,在处理大文件时会非常消耗资源

也可以使用循环去遍历文件句柄,输出文件中的内容:

In [39]: f.seek(0)
Out[39]: 0 In [40]: for line in f:
...: print(line.strip())
葫芦娃每天坚持一点,
每天努力一点,
每天多思考一点,
慢慢你会发现,
你的进步越来越大 哈哈哈哈哈哈哈你的进步越来越大 In [41]:

(2)文件操作的其他方法

  • close:关闭文件
  • readable:判断文件是否可读
  • seek:移动光标,接收两个数据第一个参数表示偏移到哪个位置(移动的单位是byte. 所以如果是UTF-8的中⽂部分要是3的倍数),第二个参数表示从那个位置开始偏移(0,代表开头,1代表当前位置,2代表结尾)
  • seekable:判断当前文件的光标是否可移动
  • tell:返回当前光标所在的位置
  • truncate:截断数据(谨慎操作),默认截断光标后所有字符
  • writable:判断文件是否可写

(3)打开文件的另一种方式

在打开一个文件后,要记得在文件使用结束狗使用close方法关闭文件句柄,但有时在中间进行大量的操作后可能会忘了关闭,下面介绍的这种方法可以不用自己手动关闭文件了,他会在您操作解说后(代码块的语句执行完毕)自动关闭文件句柄,这种方法就是使用context上下文管理,使用with语句实现:

In [43]: with open('a.txt', mode='r', encoding='utf-8') as f:   # 使用with管理上下文,最后退出时会自己执行close动作
...: for line in f:
...: print(line.strip())
葫芦娃每天坚持一点,
每天努力一点,
每天多思考一点,
慢慢你会发现,
你的进步越来越大 哈哈哈哈哈哈哈你的进步越来越大 In [44]:

python学习笔记:第8天 文件操作的更多相关文章

  1. python学习笔记(二)文件操作和集合

    集合: 集合也是一种数据类型,一个类似列表东西,它的特点是无序的,不重复的,也就是说集合中是没有重复的数据 集合的作用: 1.它可以把一个列表中重复的数据去掉,而不需要你再写判断 2.可以做关系测试, ...

  2. python学习笔记——(三)文件操作

    ·集合操作及其相应的操作符表示集合中没有插入,只有添加,因为毕竟无序 #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Vergil Zhan ...

  3. python学习笔记(11)文件操作

    一.读文件 读写文件是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直 ...

  4. python学习笔记(八)——文件操作

    在 windows 系统下,我们通过 路径+文件名+扩展名的方式唯一标识一个文件,而在 Linux 系统下通过 路径+文件名唯一标识一个文件. 文件分类:文件主要可以分为文本文件和二进制文件,常见的如 ...

  5. python学习笔记(五)文件操作和集合

    文件基本操作: 现有文件file.txt f=open('file.txt','r')#以只读方式打开一个文件,获取文件的句柄,如果是读的话,r可以不写,默认就是只读:文件不存在时,会报错 first ...

  6. Python学习笔记 -- 第六章 文件操作

    I/O编程 在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这 ...

  7. python学习笔记(三)— 文件操作

    对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句柄操作文件 3.关闭文件. 现有以下文件a.txt: 登鹳雀楼 唐代:王之涣 白日依山尽,黄河入海流. 一.文件基 ...

  8. Python学习笔记3:简单文件操作

    # -*- coding: cp936 -*- # 1 打开文件 # open(fileName, mode) # 參数:fileName文件名称 # mode打开方式 # w     以写方式打开. ...

  9. python学习笔记(五)- 文件操作

    1.读文件f = open('word.txt',encoding='utf8')  #默认打开当前目录下的文件,打开其它目录用绝对路径#f = open('word.txt',encoding='u ...

  10. Python 学习笔记之 Numpy 库——文件操作

    1. 读写 txt 文件 a = list(range(0, 100)) a = np.array(a) # a.dtype = np.int64 np.savetxt("filename. ...

随机推荐

  1. Linux案例01:eth0网卡异常

    一.现象描述 今天在调试两台物理机,做完配置重启主机后,发现一台服务器网络无法ssh连接,通过ILO进去ifconfig发现eth0配置的IP地址等信息丢失,手动重启后,可以ssh连接,但过一段时间, ...

  2. SqlServer数据库(可疑)的解决办法

    当数据库发生这种操作故障时,可以按如下操作步骤可解决此方法, 打开数据库里的Sql 查询编辑器窗口,运行以下的命令. // 1.使用指定值强制重新配置:(1.0表示为真假) sp_configure ...

  3. nginx+php+swoole安装记录

    领了台阿里服务器1vCPU 1G,做下测试研究. 系统 centos7,使用yum安装. Nginx yum install nginx ##开启nginx service nginx start 安 ...

  4. sqlserver-一次updlock和withnolock和with check option 的报错原因分析

    接口程序一直运行的很稳定,其中有一天进行了数据库的整改,导致程序不断报错, 报错信息如下 原因: 程序代码写入以下代码 select * from ViewName with(updlock) whe ...

  5. 在ASP.NET MVC中,使用Bundle来打包压缩js和css(转)

    转自:http://www.cnblogs.com/xwgli/p/3296809.html 在ASP.NET MVC4中(在WebForm中应该也有),有一个叫做Bundle的东西,它用来将js和c ...

  6. ZT 线程处理函数pthread_cleanup_push / pthread_cleanup_pop

    http://bbs.csdn.net/topics/390688105 2)创建了线程,但是线程退出时没有线程调用pthread_join() 线程资源没有回收,如果持续创建线程,到一定数量后将不能 ...

  7. Selenium2+python自动化

    一.打开网站1.第一步:从selenium里面导入webdriver模块2.打开Firefox浏览器(Ie和Chrome对应下面的)3.打开百度网址二.设置休眠1.由于打开百度网址后,页面加载需要几秒 ...

  8. S/4HANA生产订单增强WORKORDER_UPDATE方法BEFORE_UPDATE参数分析

    题目这个增强的输入参数很恐怖,长长的一串: CALL BADI l_badi->BEFORE_UPDATE EXPORTING IT_PIINSTRUCTIONVALUE = IT_PIINST ...

  9. 对Java中的异常的理解

    1.What is exception in Java? Java使用异常描述程序中可能出现的不正常情况.这个不正常可以是java认为的不正常,也可以是你主观上的出乎意料(自定义异常).总而言之,异常 ...

  10. BZOJ1014:[JSOI2008]火星人(Splay,hash)

    Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam, 我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 ...