Python文件操作

文件读操作

以读的方式打开文件:

f=open('a.txt','r') # 默认会以 读的方式打开
con=f.read()
print(con)

打开文件还可以指定编码方式:

f=open('a.txt','r',encoding='utf-8') # 指定编码方式为UTF-8
con=f.read()
print(con)

注意: 在windows中文系统中,系统默认的编码方式为GBK,而Linux 系统的默认编码方式为UTF-8。 在python2中默认的字符串格式是bytes类型,而在python3中,使用的字符编码是Unicode类型,系统内存中都会使用unicode编码,只是在数据存储和传输的时候会将字符编码为utf-8或者GBK等格式。

读取全部的文件内容,默认会带换行符:

>>> f=open('a.txt','r')
>>> f.read()
'123\naaaa'

读取一行内容:

>>> f=open('a.txt','r')
>>> f.readline()
'123\n'

如果要去掉换行符,使用:

>>> f=open('a.txt','r')
>>> print(f.readline(),end='')
123

一次读取多行文件:

>>> f=open('a.txt','r')
>>> f.readlines()
['123\n', 'aaaa']
f.close()

close() 在对文件进行操作后,一定要关闭文件。
使用with可以在对文件操作完成后自动关闭,可以同时对多个文件进行操作:

with open('a.txt','r',encoding='utf-8') as f, open('b.txt') as f1:
    pass

以bytes方式读取文件

在使用open('a.txt','r',encoding=utf-8) 读取文件时,一般会指定字符的decode编码方式,对硬盘数据进行解码操作,因为字符从硬盘读取到内存要进行utf-8到unicode的decode操作,当然,我们也可以直接读取硬盘上的bytes:

f=open('a.txt','rb')
print(f.read())
f.close()

读取的并不是字符串,可以使用decode()函数解码:

s=f.read().decode('utf-8')
print(s)

文件写操作

写文件加入换行符\n:

>>> f=open('a.txt','w')
>>> f.write('123\n')
4
>>> f.write('aaaa\n')
5
>>> f.write('cccc')
4

一次写入多行:

>>> f=open('a.txt','w')
>>> f.writelines(['a\n','b\n','c\n'])
>>> f.close()

对文件a.log文件进行修改:

import os
with open('a.log','r',encoding='utf-8') as f, open('.a.log.swap','w',encoding='utf-8') as write_f:
    for line in f:
        if 'old' in line:
            line=line.replace('old','new')
        write_f.write(line)
os.remove('a.log')
os.rename('.a.log.swap','a.log')

对文件追加内容

如果要对文件内容进行追加,使用a操作:

f=open('a.txt','a',encoding='utf-8')
f.write('11111\n')
f.write('aaaaa\n')

使用 wb模式对文件进行编辑,直接以bytes的方式写文件,如果是字符串需要编码:

f=open('a.txt','wb')
f.write('花园'.encode('utf-8'))
f.close()

文件读写

如果要在读文件的时候同时进行写操作,或者在写文件的时候进行读操作,那徐亚要使用r+,w+,a+等模式:

f=open('a.txt','r+',encoding='utf-8')
print(f.read())
f.write('11111\n')
f.close()

文件复制

前面介绍了使用bytes的方式对文件进行读写,由于最终存储在硬盘上的都是以二进制的格式,所以在对任何文件进行拷贝操作时,都可以使用bytes读写的方式完成复制,比如非字符编码格式的图片,视频等:

with open('111.jpg','rb') as f1, open('222.jpg','wb') as f2:
    for line in f1:
        f2.write(line)

使用类似cp 命令的方式, 这里使用r%s 来避免Windows下对路径的转义:

import sys
if len(sys.argv) == 3:
    with open(r'%s' %sys.argv[1],'rb') as f1, open(r'%s' %sys.argv[2],'wb') as f2:
        for line in f1:
            f2.write(line)
else:
    print('USAGE: python file1 file2')
    sys.exit()

文件的其他操作

read()可以来读取字符和字节。
文件打开方式为文本模式时,代表读取的字符个数:

f=open('a.txt','r',encoding='utf-8')
print(f.read(3))

输出内容: 花园1

文件打开为b模式时,代表读取的字节数,汉字占用三个字节,数字和字母占用一个字节:

f=open('a.txt','rb')
print(f.read(3).decode('utf-8'))

输出内容: 花

光标移动

使用seek()进行光标移动,tell能显示当前光标所在的位置:
seek有三种移动方式0,1,2,其中1和2必须在b模式下进行。
0模式表示以文件开头为起始位置,0模式下可以在文本模式进行操作。

a.txt的内容为: 花园123

f=open('a.txt','r',encoding='utf-8')
print(f.read(3))
f.seek(3,0)    # f.seek(0) 表示光标回到文件开头
print(f.tell())
输出:
花园1
3

1模式表示以光标的当前位置为起始位,第一个数字表示向后移动的字节数,一个汉字由3个字节:

f=open('a.txt','rb')
print(f.read(3).decode('utf-8'))
f.seek(4,1)
print(f.tell())
print(f.read())
输出内容:
花
7
b'23'

2 模式表示以文件末尾为起始位置,负数表示向前移动的字节数:

f=open('a.txt','rb')
print(f.read(3).decode('utf-8'))
f.seek(-2,2)           # f.seek(0,2) 表示文件的末尾
print(f.tell())
print(f.read())
输出内容:
花
7
b'23'

编写一个实现类似tail -f filename 命令的程序:

import sys
import time
with open(r'%s' %sys.argv[2],'rb') as f1:
    f1.seek(0,2)
    while True:
        line=f1.readline()
        if line:
            print(line)
        else:
            time.sleep(0.2)

truncate是截断文件,文件的打开方式必须可写,也是以字节为单位进行截取,并且只能从文本开头开始截取:

with open('a.txt','r+') as f1:
    f1.truncate(3)
文本操作后内容:
花

你可能感兴趣的:(Python文件操作)