ljzsdut
GitHubToggle Dark/Light/Auto modeToggle Dark/Light/Auto modeToggle Dark/Light/Auto modeBack to homepage

12 文件file

	文件对象是Python代码对电脑上外部文件的主要接口。虽然文件是核心类型,但是它有些特殊:没有特定的常量语法创建文件。要创建一个文件对象,需调用内置的open()函数以字符串的形式传递给它一个外部的文件名以及一个处理模式的字符串。例如,创建一个文本输出文件,可以传递其文件名以及'w'处理模式字符串以写数据。

​ python操作文件步骤:打开文件–> 操作文件–>关闭文件

​ 文件对象:可迭代对象。python中的文件对象是一个基于行的可迭代对象。当调用open()函数时,python会创建一个迭代器,从文件中每次读入一行数据。迭代器中的每一个元素都是一个字符串对象,且字符串含有行尾的’\n’,可以对这些元素使用字符串的方法进行处理。

打开文件open()

open(name[,mode,bufsize,encoding=])用于打开文件或创建文件。open方法返回的是一个文件对象。

  • name和mode都必须是字符串,name如果使用相对路径,则表示当前工作目录,相对于python代码程序所在目录。

  • mode:指定文件的打开模式,打开模式限定了可以对文件进行的操作。默认为“r”。

  • bufsize:定义输出缓存

    • 0表示无输出缓冲,直接写入文件;(只能在b模式下使用)
    • 1表示使用缓冲;通常指只缓冲一行数据()
    • 负数表示使用系统默认设置;默认值-1
    • 正数表示使用近似指定大小的缓冲(指定使用块缓冲的字节大小)
  • encoding=‘utf-8’ :默认选项,文件默认是以二进制形式存储的,python会将最先读取的二进制之自动转换为encoding指定的编码,默认为utf-8。注意,如果对文件进行写操作,需要显示指定encoding=‘utf-8’。

mode详解:

  • 基本mode:
基本mode:
r: 只读,以'r'处理模式打开文件,缺省的默认处理模式   
		open('/var/log/message.log','r')
		open('/tmp/test.txt')
w: 只写(不可读),如果文件不存在,自动创建;如果文件存在,则先清空内容
x :排他。只写(不可读),如果文件不存在,自动创建;如果文件存在,则报错(不是清空)
a: 追加(不可读),如果文件不存在,自动创建;如果文件存在,则追加内容。注意:a模式打开文件时,游标会处于末尾位置,之后调整seek(),游标会根据seek调整,但是写的时候无论如何游标处于何处,都会先移动到文件末尾处,然后追加写(a+亦如此)。
  • 其他mode:
+:更新。在模式后使用,“+”表示同时支持输入、输出操作,如r+(以r模式打开文件,可以读写)、w+(以w模式打开文件(清空内容),可以读写)、x+、a+
	r+:打开时,指针在0位置(文件开始)。如:f = open('aa.txt','r+',encoding='utf-8')
		直接读:0开始;直接写:0开始
		读后再写:会以追加的方式写,如果想要在指针位置开始写,手动seek(f.tell())。例如seek(0,2)从末尾开始写。
	w+:打开时,w会先清空内容后指针置为0,再进行其他操作。
	x+:同w+,只不过有判断文件是否存在的附加功能。
	a+:打开时,指针移动到最后。此时无论如何调整seek()都是无效的,写的时候都是追加的方式在文件末尾处写。
b:二进制模式,在模式后使用“b”表示以二进制方式打开,如rb、rb+,注意此时不能指定encoding。需要注意的是:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型。
t:文本模式(默认值)

mode总结:一般都是用’r+’或者’rb+’,因为r+比w更加安全,不会清空文件内容;r+比a更加灵活,因为a模式使用seek无论调节写入的位置,只能在末尾处追加。

文件操作与方法

文件关闭

file.close()

文件读取

file. read([size])
file.readline([size]) 
file.readlines() 
next(file)或for循环
  • file. read([size]) 从文件指针处读取size个字符(如果以“b”方式打开,读取单位是“字节byte”),如果size为负数或者省略,则一直读取到EOF(文件末尾)。

    它通常用于读取整个文件内容放到一个字符串变量中(内存),将读取到的字符以字符串的形式返回。无论文件内存储存的是什么数据类型,文件的内容的类型都是字符串。在file.close()之前,每读取一次,指针就会变动一次,第二次读取会在第一次读取后的指针位置开始。指针位置通过tell()获取,通过seek()调整。

  • file.readline([size]) 每次只读取文件的一行(从指针处开始至行尾,包括\n换行字符),将读取到的一行内容放到一个字符串变量中。

    通常比 file.readlines()慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用.readline()。size指定读取当前行的多少个字符(从指针处开始,最多读取至该行的末尾)

    >>> f1=open('/etc/passwd','r+')
    >>> f1.readline()
    root:x:0:0:root:/root:/bin/bash
    >>> f1.readline()		#指针指向了下一行
    bin:x:1:1:bin:/bin:/sbin/nologin
    
  • file.readlines() 按行读取整个文件内容(包括\n换行符),将读取到的内容放到一个字符串列表中(将文件内容分析成一个行的列表),返回list类型,该列表可以由 python的for... in ... 结构进行遍历处理。*大文件比较耗费内存,不建议使用。*

    >>> f1=open('/etc/passwd','r+')
    >>> list1=f1.readlines()
    >>> type(list1)
    <type 'list'>
    
  • 文本迭代器:文本迭代器是最好的行读取工具。

    >>> f1=open('/etc/passwd','r+', encoding='utf-8')
    >>> next(f1)
    'root:x:0:0:root:/root:/bin/bash\n'
    >>> next(f1)
    'bin:x:1:1:bin:/bin:/sbin/nologin\n'
    
    #推荐方式:每次读取一行到内存
    f = open('aa.txt','r+',encoding='utf-8')
    for line in f:
        print(line)
    

写操作

  • file.write('new line\n') 将字符串写入到文件对象,返回写入的字符数。注意必须传入的是已经格式化的字符串对象,并且需要手动写入\n换行符,write不会自动生成\n。

  • file.writelines(list_of_strings) 将整个字符串的列表写入文件。

  • file.flush() 刷写。将缓冲区数据写入磁盘,但不关闭文件对象。否则只能在文件对象关闭或者程序执行完毕后,才能将数据从内存写入磁盘。

  • file.truncate(file.seek(num)) 从文件头部截取文件内容到当前指针处(删除指针位置到文件末尾)

1、写操作之后需要flush() 或 close()才能将buffering写入到磁盘。

2、file对象的read和write相关方法都必须将对象转换为字符串写入,并且读出的内容也是字符串,并不是各种原生对象。如果要在文件中存储python的原生对象,可以使用python的标准库pickle模块来实现。

文件指针(游标)

  • file.tell() 文件指针(游标)在文件的位置(偏移量,单位:字节)

  • file.seek(offset[,whence=0]) 设定文件指针位置

    offset:偏移量,单位为:字节(使用next方法偏移一行) 例如:file.seek(0),让指针回到文件头

    whence: whence [wens] n. 来源(此处理解为:起始点)偏移相对位置为os模块当中的SEEK_SET、SEEK_CUR、SEEK_END:表示offset相对于哪个位置计算偏移值。

    • 0或os.SEEK_SET:从文件头部开始偏移,缺省默认值
    • 1或os.SEEK_CUR:从文件当前位置开始偏移
    • 2或os.SEEK_END:从文件尾部部开始偏移

文件的属性

file.name

file.encoding

file.mode

file.closed

file.fileno() 文件描述符

file.readable() 是否可读

file.writable() 是否可写

file. seekable() 如果流支持随机访问,则返回True。

file.isatty() 判断是否为一个终端设备文件

上下文管理器

为了避免打开文件后忘记关闭,可以通过with语句的上下文管理来打开文件,此时,当with代码块执行完毕时,内部会自动关闭并释放文件资源。即:

with open('aa.txt','r+',encoding='utf-8') as f: 
  pass

在Python 2.7 及以后,with又支持同时对多个文件的上下文进行管理,例如:复制文件

with open('aa.txt','r+',encoding='utf-8') as f1 , open('bb.txt','w+',encoding='utf-8') as f2:
    for line in f1:
        f2.write(line)