Python文件相关操作

打开文件

打开文件,采用open方法,会将文件的句柄返回,如下:

  1. f = open('test_file.txt','r',encoding='utf-8')

在上面的代码中,open()方法进行打开文件等相关操作,open()方法其中第一个参数是要打开的文件的文件路径,第二个参数是对要打开文件要执行的权限,第三个参数是文件采用字符编码。

而open()方法返回的内容叫做文件句柄。我们可以打印返回的文件句柄来看下:

  1. f = open('test_file.txt','r',encoding='utf-8')
  2.  
  3. print(f)

执行的结果如下:

  1. <_io.TextIOWrapper name='test_file.txt' mode='r' encoding='utf-8'>

此时文件句柄f中,包含被打开文件的相关信息,而我们可以通过一些属性和方法来获取文件的相关信息。

文件名称

获取被打开文件名称: f.name

  1. f = open('test_file.txt','r',encoding='utf-8')
  2. print(f.name) # test_file.txt

文件指针

在使用python读取文件的时候,需要参照文件指针来进行读取,而下面我们可以来看下关于文件指针的相关操作。

获取文件指针位置

获取文件指针位置可以使用tell()方法,能够获取文件指针位置

  1. # 打开文件
  2. f = open('test_file.txt','r',encoding='utf-8')
  3.  
  4. # 获取文件指针位置
  5. print(f.tell()) # 返回的值就是文件指针所在的位置

需要注意的是,文件指针并不是不变的,随着文件读取,指针的位置也会发生变化。

调整文件指针位置

因为文件的指针会随着文件的读取而发生变化,那么如果需要调整读取位置重新读取,就需要调整文件指针,在python中,如果想要调整文件指针,可以使用seek()方法

代码如下:

  1. # 打开文件
  2. f = open('test_file.txt','r',encoding='utf-8')
  3.  
  4. f.seek(0) # 将文件指针调整到初始0的位置

那么需要注意的是,seek()方法的括号内写的是指针将要被调整的位置,如果没有设置这个参数,那么执行的时候就会报错。
通常情况下,我们是将参数设置为0。

判断文件指针是否可以移动

在python中的某些时候,我们需要判断指针是否可以进行移动,而实现这样的需求需要采用seekable()方法。如果可以移动,返回True,如果不可以移动,返回False

  1. # seekable()方法,判断当前文件指针是否可以移动
  2. print(f.seekable()) # True

判断文件的字符编码

判断文件的字符编码可以采用encoding属性。

  1. print(f.encoding)

查看文件在内存中的编号

查看文件在内存中的编号,可以采用fileno()方法

  1. print(f.fileno())

判断文件是否可读可写

在Python的文件操作中,需要给予文件句柄不同的权限,而我们常用的文件权限有如下:

打开文件的模式有:

  • r,只读模式(默认)。
  • w,只写模式。【不可读;不存在则创建;存在则删除内容;】
  • a,追加模式。【可读; 不存在则创建;存在则只追加内容;】

"+" 表示可以同时读写某个文件

  • r+,可读写文件。【可读;可写;可追加】
  • w+,写读
  • a+,同a

"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)

  • rU
  • r+U

"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)

  • rb
  • wb
  • ab

文件权限的设置可以根据不同的需求,来进行不同的设置,但是在判断文件具有什么权限的时候通常我们使用最多的有是否可读是否可写

判断文件是否可读,使用readable()方法,判断文件是否可写,使用writeable()方法。

  1. # 打开文件
  2. f = open('test_file.txt','r',encoding='utf-8')
  3.  
  4. # 判断文件可读可写的权限
  5. print(f.readable())
  6. print(f.writable())

判断文件是否关闭

文件存在打开的环节,那么就要在不需要文件的时候将文件关闭,从而节约性能资源,那么关闭文件在python中使用close()方法,而判断文件是否关闭,使用closed()方法。

  1. f = open('test_file.txt','r',encoding='utf-8')
  2.  
  3. print(f.closed)

读取文件

读取文件中的一行

python中,想要读取文件中的一行内容,可以采用readline()方法,如下:

  1. # 打开文件
  2. f = open('test_file.txt','r',encoding='utf-8')
  3.  
  4. # 读取文件中的一行
  5. print(f.readline())

通过readline()方法可以读取文件中的一行内容,当然,如果想要继续读取下一行,可以继续使用readline()方法。

  1. print(f.readline())

那么此时需要注意的是,每读取一行,文件当中的指针就会发生变化,我们可以使用tell()方法来查看文件指针的变化.

  1. print(f.readline())
  2. # 读取一行内容之后,通过tell()方法来查看文件内容的指针。
  3. print(f.tell())

当然,如果想要读取并且全部输出文件中更多的行数,可以通过循环的方式。

文件中的内容如下:

  1. 白日依山尽,
  2. 黄河入海流。
  3. 欲穷千里目,
  4. 更上一层楼。

那么循环读取输出四行:

  1. # 打开文件
  2. f = open('test_file.txt','r',encoding='utf-8')
  3.  
  4. # 想要读取输出四行
  5. for line in range(4):
  6. print(f.readline())

输出的结果:

  1. 白日依山尽,
  2. 黄河入海流。
  3. 欲穷千里目,
  4. 更上一层楼。

此时,通过循环我们已经顺利的将文件中的四行内容全部输出了,但是发现每一行之间都存在一行空行,原因是在每一行的结尾都存在一个\n换行,那么可以通过rstrip()方法将换行去掉,代码如下:

  1. # 可以将上述的循环改为下面的写法
  2. for line in range(4):
  3. print(f.readline().rstrip())

那么代码更改之后的输出样式如下:

  1. 白日依山尽,
  2. 黄河入海流。
  3. 欲穷千里目,
  4. 更上一层楼。

每一句后面的换行已经被成功的去除。

但是此时还存在一个问题,就是当文件中行数并不清楚时该如何读取并且输出所有的行呢?

读取文件中的所有行

想要读取文件中的所有的行,可以使用readlines()方法。

代码如下:

  1. # 打开文件
  2. f = open('test_file.txt','r',encoding='utf-8')
  3.  
  4. # 读取文件中的所有的行
  5. print(f.readlines())

输出的内容如下:

  1. ['白日依山尽,\n', '黄河入海流。\n', '欲穷千里目,\n', '更上一层楼。']

那么我们发现此时输出的内容类型为一个列表。并且每一个列表元素的最后都包含一个换行\n。

我们如果想要把返回的所有的内容全部读取输出,可以采用如下的方式:

  1. # 打开文件
  2. f = open('test_file.txt','r',encoding='utf-8')
  3.  
  4. for index in (f.readlines()):
  5. print(index.rstrip())

输出的结果如下:

  1. 白日依山尽,
  2. 黄河入海流。
  3. 欲穷千里目,
  4. 更上一层楼。

那么此时如果我们想要具体输出其中的某行,可以采用如下的写法:

  1. # 打开文件
  2. f = open('test_file.txt','r',encoding='utf-8')
  3.  
  4. for index,line in enumerate(f.readlines()):
  5. if index == 2:
  6. print(line.rstrip())
  7. else:
  8. continue

输出的结果为:

  1. 欲穷千里目,

上面代码中的写法已经完美的实现了输出文件所有内容的需求,但是从实际的应用角度来看,上面的写法只适用于被读取文件较小的情况,如果被读取文件较大,那么上面的代码就会导致程序的等待时间较长。

推荐使用的读取文件中所有内容的写法

那么为了解决上述的问题,我们可以将读取文件所有内容的写法换成如下:

  1. # 打开文件
  2. f = open('test_file.txt','r',encoding='utf-8')
  3. # 读取文件所有内容
  4. for line in f:
  5. print(line.rstrip())

最终的输出结果为:
白日依山尽,
黄河入海流。
欲穷千里目,
更上一层楼。
同样,现在的这种方法也实现了上面实例的最终效果。

那么这两种方法的区别在于什么呢?

第一种方法,读取文件所有的内容采用的是readlines()方法,先来将文件的所有的行所有的内容全部读取后,再来进行其他操作处理,而第二种方式是一行一行的读取。

当我们使用第一种方式读取一个较大文件时就会导致等待时间过长,而第二种方法则不会存在这种问题。

那么如果想要实现只输出内容中具体的某行,可以采用如下类似的写法:

  1. # 打开文件
  2. f = open('test_file.txt','r',encoding='utf-8')
  3.  
  4. # 读取文件中的第二行
  5. count = 0
  6. for line in f:
  7. if count == 1 :
  8. print(line)
  9. count += 1

Tip:读取文件的内容,还可以采用下面的方式

  1. # 打开文件
  2. f = open('test_file.txt','r',encoding='utf-8')
  3.  
  4. print(f.read())

输出的结果:
白日依山尽,
黄河入海流。
欲穷千里目,
更上一层楼。

但是因为这种输出方式输出后的内容不利于操作,所以这种方式并不是很推荐。

文件的写入操作

说完了文件的读取操作,我们在来说下文件的写入操作。

首先,想要向文件中写入内容,需要将open()方法中的权限进行更改,如下:

  1. # 打开文件 -- 将文件的权限改为 w
  2. f = open('test_write.txt','w',encoding='utf-8')

test_write.txt 文件此时是一个空白的文本文件

向文件中写入内容可以采用write()方法

  1. # 打开文件 -- 将文件的权限改为 w
  2. f = open('test_write.txt','w',encoding='utf-8')
  3.  
  4. # 使用write()方法向文件中写入内容
  5. f.write('Hello,YanYan')

此时,执行代码后,test_write.txt 文件的内容由空白就会变为Hello,YanYan

但是在写入内容的时候,有一点是需要注意的,当open()方法返回的文件句柄的权限是w的时候,我们在一个python文件中通过代码向文件中写入内容,例如:

  1. # 打开文件 -- 将文件的权限改为 w
  2. f = open('test_write.txt','w',encoding='utf-8')
  3.  
  4. # 使用write()方法向文件中写入内容
  5. f.write('Hello,YanYan')
  6. f.write('Hello,Good Gril')

那么test_write.txt文件中的内容如下:

  1. Hello,YanYanHello,Good Gril

但是一旦另外一个代码同样通过open()方法打开了test_write.txt,并且文件句柄的权限为w,那么在这个代码中写入的内容就会将test_write.txt文件中之间的内容覆盖掉,就是说,test_write.txt之前的内容就会消失,从而被写入新的内容。

如果想要在文件原内容基础之上追加新的内容,需要将权限w改为a即可。

  1. # 打开文件 -- 将文件的权限改为 a
  2. f = open('test_write.txt','a',encoding='utf-8')
  3.  
  4. # 使用write()方法向文件中写入内容
  5. f.write('YanYan is good Gril')

那么这样就不会产生覆盖。

Tip:需要注意的是,当我们将文件句柄的权限设置为w或者a的时候就不能够读取文件,而如果想要既可以读取又可以写入的话,推荐将文件的权限设置为r+ ,读写模式,即可以读取又可以写入,是目前使用频率较高的文件权限

flush()方法

在python中,我们在向文件中写入内容的时候,看似是写入的代码写入一行,文件就增加一行,
其实在系统执行的时候是先将代码中写入的内容存储到缓存区中,当存储到一定数量时在统一的进行存储。而flush的作用就是手动的进行刷新存储

 文件关闭

我们在通过python打开了一个文件后,需要通过close()方法关闭,虽然python的垃圾回收机制会将文件自动关闭,但是如果打开的文件过多,或者文件过大, 那么就会严重的影响性能。
所以在使用文件系统的时候要学会及时关闭,但是在开发中还是会出现忘记关闭文件的情况,为了解决这种问题,我们可以使用with方法来实现,具体代码如下

  1. # 使用with方法打开文件和关闭文件
  2. with open('file_text_bak.txt','w',encoding="utf-8") as f:
  3. print(f)

在python2.7之后,with方法还支持一次打开多个文件

  1. with open('file_text_bak.txt','w',encoding='utf-8') as f ,open('file_text.txt','r',encoding='utf-8') as f_old:
  2. print(f_old)

Tip:python文档中规定,一行文旦最好不要超过80个字符,而如果我们像上面那样一次打开两个甚至更多的文件会导致一行的字符过长,可以进行如下的更改。

  1. with open('file_text_bak.txt','w',encoding='utf-8') as f ,\
  2. open('file_text.txt','r',encoding='utf-8') as f_old:
  3. print(f_old)

python文件相关操作的更多相关文章

  1. Git基本命令 -- 基本工作流程 + 文件相关操作

    可以先找一个已经被git管理的项目, 我就使用这个项目吧: https://github.com/solenovex/ID3-Editor 基本工作流程 克隆以后呢, 进入该目录查看一下状态: 然后添 ...

  2. Python文件基础操作(IO入门1)

    转载请标明出处: http://www.cnblogs.com/why168888/p/6422270.html 本文出自:[Edwin博客园] Python文件基础操作(IO入门1) 1. pyth ...

  3. python文件高级操作

    python文件高级操作和注意事项等等 文件过大保护 由于read是一次性读取文件所有的内容,如果文件100G,内存就会吃不消,所以推荐使用read(size)一次读取指定字节/字符(根据rb,或者r ...

  4. python 文件读写操作(24)

    以前的代码都是直接将数据输出到控制台,实际上我们也可以通过读/写文件的方式读取/输出到磁盘文件中,文件读写简称I/O操作.文件I/O操作一共分为四部分:打开(open)/读取(read)/写入(wri ...

  5. python 文件相关知识

    字符编码相关 什么是字符编码 字符编码的类型 字符编码的使用 python2和python里字符编码的区别 文件的相关 文件的基础操作 打开文件的模式 字符编码 什么是字符编码在计算机里只识别二进制, ...

  6. python PIL相关操作

    项目中需要用python生成二维码,这里记录一下相关PIL相关操作. RGBA问题: 需要将图片A粘贴到图片B上,之前没有注意透明度问题,A的背景是透明的,粘贴到B上后,A的周围是黑的.后来才发现是P ...

  7. python文件的操作

    文件的操作,归根结底就只有两种:打开文件.操作文件 一.打开文件:文件句柄 = open('文件路径', '模式') python中打开文件有两种方式,即:open(...) 和  file(...) ...

  8. python subprocess相关操作

    python subprocess常用操作 1.subprocess模块的常用函数 函数 描述 subprocess.run() Python 3.5中新增的函数.执行指定的命令,等待命令执行完成后返 ...

  9. Python 文件常见操作

    # -*-coding:utf8 -*- ''''' Python常见文件操作示例 os.path 模块中的路径名访问函数 分隔 basename() 去掉目录路径, 返回文件名 dirname()  ...

随机推荐

  1. python数字前自动补零

    >>> '%d' % 23 #输出23 ' >>> '%5d' % 23 #输出的数字前有3个空位,共占5个字符 ' >>> '%05d' % 2 ...

  2. JavaScript基本数据类型介绍

    JavaScript基本数据类型介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是javascript JavaScript一种直译式脚本语言,是一种动态类型.弱类型. ...

  3. select遍历list默认选中初始值

    <select id="userstatus" name="userstatus">         <c:forEach items=&qu ...

  4. html5 canvas 弧形描边渐变

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 第9月第7天 uicollectionview

    1. /** The margins used to lay out content in the section controller. @see `-[UICollectionViewFlowLa ...

  6. CSS border系列

    本文更新版链接 一.border 关于border的3个属性,分别为border-width.border-style.border-color. 其中,border-color默认为元素内容的前景色 ...

  7. Javascript - LayUI库的流加载

    LayUI库的流加载 用的LayUI-v2.2.45,将整个包解压缩后添加到项目,引入两个文件即可,不需要引入Jquery,此库自带: <link href="../js/layui- ...

  8. 八、mini2440裸机程序之UART(2)UART0与PC串口通信【转】

    转自:http://blog.csdn.net/shengnan_wu/article/details/8309417 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.相关原理图 2.相关寄 ...

  9. Linux dd命令中dsync与fdatasync的区别【转】

    在Linux系统中经常会使用dd命令来测试硬盘的写入速度,命令会涉及到两个参数:dsync与fdatasync,本文介绍一下其区别. dd if=/dev/zero of=/tmp/1Gbytes b ...

  10. SharePoint 2013 另一个程序正在使用此文件,进程无法访问。 (异常来自 HRESULT:0x80070020)

    环境:SharePoint 2013 + Windows Server 2012 R2 在管理中心新建一个Web Application,端口为:88.顺利创建网站集后,打开访问却提示:无法显示此页 ...