python文件读写

  • open() 方法

Python内置了一个open()方法,用于对文件进行读写操作。

使用open()方法操作文件可以分三步走,一是打开文件,二是操作文件,三是关闭文件,

open()方法的返回值是一个file对象,可以将它赋值给一个变量(文件句柄)。

f = open(filename, mode)

filename:一个包含了你要访问的文件名称的字符串值,通常是一个文件路径。

mode:打开文件的模式,有很多种,open方法默认是只读方式r,

filenmae='/Users/mlamp/Documents/py_project/foo.txt'

f = open(filename,'w')            #打开文件
f.write('青春不老,我们不散')        #操作文件
f.close                           #关闭文件

通过open()方法,使用“w“的模式,打开一个文件加载到内存里,它的返回值是一个file对象,然后赋值给f这个变量,f这个变量就有了file的属性,可以使用read() , write() 方法,当使用f.write(‘XXX’)时,就会将XXX内存中的这个文件中,只有使用了f.close()才会将内存中的信息加载到foo.txt这个文件中
  • 打开模式

模式

操作说明
r只读默认模式,如果文件不存在就报错,存在就正常读取。
w只写如果文件不存在,新建文件然后写入;如果存在,先清空文件内容,再写入。
a追加如果文件不存在,新建文件,然后写入;如果存在,在文件的最后追加写入。追加写入,单独使用 a
x新建如果文件不存在,就新建文件,然后写入内容,如果文件存在则报错,比w模式更安全。
b二进制模式比如rb、wb、ab,以bytes类型操作数据
+读写模式

比如r+、w+、a+

  • b  二进制模式

二进制模式,通常用来读取图片、视频等二进制文件。注意,它在读写的时候是以bytes类型读写的,因此获得的是一个bytes对象而不是字符串。在这个读写过程中,需要自己指定编码格式。在使用带b的模式时一定要注意传入的数据类型,确保为bytes类型。

>>> s='不积跬步,无以至千里'
>>> b=bytes(s,encoding='utf-8')
>>> f=open(filename,'wb')
>>> f.write(b)
30
>>> f.close()
>>> f
<_io.BufferedWriter name='/Users/mlamp/Documents/py_project/foo.txt'>
  • 编码问题

要读取非UTF-8编码的文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件

>>> f = open('gbk.txt', 'r', encoding='gbk')
>>> f.read()
'GBK‘
  • 文件对象操作

  • f.read(size)

读取一定大小的数据, 然后作为字符串或字节对象返回。size是一个可选的数字类型的参数,用于指定读取的数据量。当size被忽略了或者为负值,那么该文件的所有内容都将被一次性读取并且返回。

f = open("1.txt", "r")

str = f.read()
print(str)

f.close()

如果文件体积较大,请不要使用read()方法一次性读入内存,而是read(512)这种一点一点的读

python 读取4G的大文件时,就需要按照size的方式读取,size的单位时字节
def get_nums(filepath,size=2048,encoding='utf-8'):
    while True:
        part = open(filename,'r').read(size)
        if part:
            yield part
        else:
            return None
  •  f.readline()

从文件中读取内容,每次只能读取一行,换行符为'\n'。如果返回一个空字符串,说明已经已经读取到最后一行。这种方法,通常是读一行,处理一行,并且不能回头,只能前进,读过的行不能再读了。

  • f.readlines()

将文件中所有的行,一行一行全部读入一个列表内,按顺序一个一个作为列表的元素,并返回这个列表。readlines方法会一次性将文件全部读入内存,所以也存在一定的风险。但是它有个好处,每行都保存在列表里,可以随意存取。

  • 遍历文件,将文件对象当作一个迭代器来使用

  • 以上几种不同的读取和遍历文件的方法比较:

如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便。普通情况,使用for循环更好,速度更快

  • f.write()

将字符串或bytes类型的数据写入文件内。write()动作可以多次重复进行,其实都是在内存中的操作,并不会立刻写回硬盘,直到执行close()方法后,才会将所有的写入操作反映到硬盘上

# 打开一个文件
f = open("/tmp/foo.txt", "w")
f.write("hello \n world \n")
# 关闭打开的文件
f.close()
  • f.tell()   返回文件读写指针当前所处的位置,它是从文件开头开始算起的字节数
  • f.seek(offset,from_what),seek()常跟tell()配合使用

from_what=0表示从文件开头计算,from_what=1表示从文件读写指针的当前位置开始计算,from_what=2表示从文件的结尾开始计算,默认为0

offset 表示偏移量

seek(x,0) : 从起始位置即文件首行首字符开始移动 x 个字符

seek(x,1) : 表示从当前位置往后移动x个字符

seek(-x,2):表示从文件的结尾往前移动x个字符

  • with 关键字

with关键字用于Python的上下文管理器机制。为了防止open这一类文件打开方法在操作过程出现异常或错误,或者最后忘了执行close方法,保证文件会被正常关闭。在它的管理下,不需要再写close语句

with open('test.txt', 'w') as f:
    f.write('Hello, world!')

with支持同时打开多个文件:
with open('log1') as obj1, open('log2','w') as obj2:
    s=obj1.read()
    obj2.write(s)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值