Python文件处理

独自空忆成欢 提交于 2020-04-01 04:03:23

一、open模式

文件是日常编程中常用的操作,通常用于存储数据或应用系统的参数

语法:

       open(filename,mode)

参数:

       filename:要访问的文件名

       mode:打开文件的模式

模式

说明

r

以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。

w

打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

a

打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

rb

以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。

wb

以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

ab

以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

r+

打开一个文件用于读写。文件指针将会放在文件的开头。

w+

打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

a+

打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。

rb+

以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。

wb+

以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

ab+

以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

 

二、常用函数

序号

方法及描述

1

file.close()

关闭文件。关闭后文件不能再进行读写操作。

2

file.flush()

刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。

3

file.fileno()

返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。

4

file.isatty()

如果文件连接到一个终端设备返回 True,否则返回 False。

5

file.next()

返回文件下一行。

6

file.read([size])

从文件读取指定的字节数,如果未给定或为负则读取所有。

7

file.readline([size])

读取整行,包括 "\n" 字符。

8

file.readlines([sizeint])

读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。

9

file.seek(offset[, whence])

设置文件当前位置

10

file.tell()

返回文件当前位置。

11

file.truncate([size])

从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后 V 后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。

12

file.write(str)

将字符串写入文件,没有返回值。

13

file.writelines(sequence)

向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行

 

三、常用的open模式

r:读模式,文件不存在时不会创建新文件,文件的指针将会放在文件的开头。默认模式

f = open('test.txt','r',encoding='UTF-8')       #encoding是转码的意思,告诉解释器以UTF-8的编码格式。不指定的话默认是以操作系统的编码为准的
print(f.read())                                 #读所有,bytes--decode(utf-8)--str
# print(f.read(5))                              #读取5个字符串(b模式下单位是字节)
# print(f.readlines())                          #读所有,将结果放入列表中
# print(f.readline())                           #一次读一行
# print(f.readline(),end='')                    #一次读一行,并指定结束符,默认结束符为\n
f.close()                                       #关闭文件

执行结果:
第一行
第二行
第三行

w:写模式,文件存在时则覆盖,文件不存在时创建新文件

f = open('aa.txt','w',encoding='UTF-8')
f.write('第一行 \n')                           #换行需要添加换行符
f.write('第二行\n')
# f.writelines('第三行\n','第四行\n')           #写入一个字符串列表,换行需要添加换行符

#aa.txt中的内容:
第一行
第二行

a:追加模式。如果该文件已存在,文件指针将会放在文件的结尾,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入

f = open('aa.txt','a',encoding='UTF-8')
f.write('追加的内容')
# print(f.tell())                             #打印光标当前位置,单位是字节
# f.flush()                                   #使内存的内容刷新至文件
# f.seek(0)                                   #a模式光标会定位在文件尾部,这里重新定位一下光标位置
# print(f.tell())                             #输出光标位置为0
f.close()

#aa.txt中的内容:
第一行
第二行
追加的内容

rb:二进制格式的读模式。文件指针将会放在文件的开头

f = open('test.txt','rb')
print(f.read())
# print(f.read().decode('UTF-8'))       #可以decode,输出字符串
f.close()

#执行结果:
b'\xe7\xac\xac\xe4\xb8\x80\xe8\xa1\x8c\r\n\xe7\xac\xac\xe4\xba\x8c\xe8\xa1\x8c\r\n\xe7\xac\xac\xe4\xb8\x89\xe8\xa1\x8c'

wb:二进制格式的写模式。文件存在时则覆盖,文件不存在时创建新文件

f = open('a.txt','wb')
f.write('你好'.encode('UTF-8'))         #字符串是Unicode编码,不能直接作为bytes类型写入,需要encode
f.close()

ab:二进制格式的追加模式。如果该文件已存在,文件指针将会放在文件的结尾,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入

r+:读写模式。文件指针将会放在文件的开头。

w+:读写模式。文件存在时则覆盖,文件不存在时创建新文件

a+:读写模式。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写

rb+:二进制格式的读写模式。文件指针将会放在文件的开头

wb+:二进制格式的读写模式。文件存在时则覆盖,文件不存在时创建新文件

ab+:二进制格式的追加模式。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写

 

四、 with open语句

如果不用with语句,代码如下:

f = open('test.txt','r',encoding='UTF-8')
print(f.read())
f.close()

这里有两个问题:一是可能忘记关闭文件句柄;二是文件读取数据发生异常,没有进行任何处理。对于这种场景,Python的with语句提供了一种非常方便的处理方式。一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄。

with open('test.txt','r',encoding='UTF-8') as f:
    print(f.read())

 

五、File(文件) 方法

1、file.read([size])

从文件中读取指定的字节数,如果未给定或为负则读取所有。

语法:

  fileObject.read();

参数:

       size:从文件中读取的字节数

       (文件打开方式为文本模式时,代表读取n个字符;文件打开方式为b模式时,代表读取n个字节)

返回值:

       返回从字符串中读取的字节

实例:

#test.txt的内容如下:
第一行
第二行
第三行

#读取文件内容:
f = open('test.txt','r',encoding='UTF-8')
#print(f.read())            #读取所有
print(f.read(5))            #读取5个字符串

#输出结果如下:
第一行
第

2、file.seek(offset[, whence])

seek() 方法用于移动文件读取指针到指定位置

语法:

  fileObject.seek(offset[, whence])

参数:

       offset -- 开始的偏移量,也就是代表需要移动偏移的字节数

       whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起

       (1和2必须在b模式下才能执行)

实例1:

f = open('test.txt','r',encoding='UTF-8')
print(f.read())                     #读取完所有内容,此时光标在文件最后
f.seek(3)                           #从文件开头位置往后偏移3个字节
print(f.read())
print(f.tell())                     #打印光标当前位置

#返回的结果
第一行
第二行
第三行
一行
第二行
第三行
31

实例2:

f = open('test.txt','rb')
print(f.read(3).decode('UTF-8'))                    #读取三个字节,此时光标在第三个字节的位置
print(f.tell())
f.seek(3,1)                                         #从当前位置往后偏移3个字节
print(f.read().decode('UTF-8'))

#返回的结果
第
3
行
第二行
第三行

实例3:

f = open('test.txt','rb')
f.seek(0,2)                                         #从文件末尾位置偏移0个字节,就是文件最后
print(f.tell())
f.seek(-3,2)                                        #从文件末尾位置往前偏移3个字节
print(f.tell())
print(f.read().decode('UTF-8'))

#返回的结果
31
28
行

3、file.truncate([size])

truncate() 方法用于从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小

语法:

  fileObject.truncate( [ size ])

参数:

       size -- 可选,如果存在则文件截断为 size 字节

实例:

f = open('test.txt','r+',encoding='UTF-8')  #读写模式
f.truncate(6)                               #截取6个字节
print(f.read())

#返回的结果
第一

 

六、 小程序

1、文件拷贝

with open('test.txt','r',encoding='UTF-8') as read_f,open('test2.txt','w',encoding='UTF-8') as write_f:
    for line in  read_f:                    #循环读取test.txt文件内容
        write_f.write(line)                 #写入到test2.txt

2、图片拷贝

import sys

source_file,target_fiel=sys.argv[1],sys.argv[2]                                     #传参赋值

with open(source_file,'rb') as read_f,open(target_fiel,'wb') as write_f:            #二进制模式
    for line in  read_f:
        write_f.write(line)

#用法:python copy.py source.jpg target.jpg
#适用于任何类型文件的拷贝

3、仿tail程序

import sys
import time

file = sys.argv[2]

with open(file,'rb') as f:                      #下面要用到seek()方法的whence,所以用b模式
    f.seek(0,2)
    while True:
        line = f.readline()
        if line:
            print(line.decode('UTF-8'))
        else:
            time.sleep(0.2)

#用法:python tail.py -f xxx.log

4、文件修改

import os

with open('test.txt','r',encoding='utf-8') as read_f,open('.test.txt.swap','w',encoding='utf-8') as write_f:
    for line in read_f:
        if line.startswith('第三行'):
            line='这是修改后的第三行'
        write_f.write(line)

os.remove('test.txt')
os.rename('.test.txt.swap','test.txt') 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!