python学习-文件的输入、输出

文件的输入输出

文件:数据持久化最简单的类型,也叫平面文件(flat file)。它仅仅是一个文件名下的字节流,把数据从一个文件读入内存,然后从内存写入文件。

读一个文件之前需要打开它,之后可以调用函数来读写数据,最后需要关闭文件。

fileobj = open(filename,mode)

        fileobj 是open()返回的文件对象;

        filename  是该文件的字符串名;

        mode 是指明文件类型和操作的字符串;

mode的第一个字母表明对其的操作:

r  表示读模式

w  表示写模式。如果文件不存在则新创建,如果存在则重写新内容

x   表示文件不存在的情况下新创建并写文件

a   表示如果文件存在,在文件末尾追加写内容

mode 的第二个字母是文件类型:

t   (或省略)代表文本类型

b    代表二进制文件

使用write()写文件

>>>poem="""There was a young lady named Bright,\
      whose speed was far faster than light;\
      She started one day \
      In a relative way,\
      And returned on the previous night."""

>>> len(poem)
167
>>> fout = open('relativity','wt')  #文件默认放在python的根目录下D:\python3
>>> fout.write(poem)
167
>>> fout.close()
>>> fout = open('relativity1','wt')
>>> print(poem,file=fout)    # 169  print()默认会在每个参数后添加空格,在每行结束处添加换行。它在文件relativity1中默认添加了一个换行。
>>> fout.close()

使用如下参数,保证print()与write()有同样的输出:

sep分隔符:默认是一个空格 ‘ ‘

end 结束字符:默认是一个换行符 ‘\n’

>>> fout = open('relativity2','wt')
>>> print(poem,file=fout,sep='',end='')  #167
>>> fout.close()
>>> 

如果源字符串非常大,可将数据分块,直到所有字符被写入:

>>> fout = open('relativity3','wt')
>>> size = len(poem)
>>> offset = 0
>>> chunk = 100
>>> while True:
        if offset > size:
            break
        fout.write(poem[offset:offset+chunk])
        offset+=chunk
100
67
>>> fout.close()

如果‘relativity’文件已经存在,可使用模式x 避免重写文件,还可加入一个异常处理:

>>> try:
      fout = open(‘relativity’,’xt’)
      fout.write(‘stomp stomp stomp’)
   except FileExistsError:
      print(‘relativity already exists!. That was a close one.’)

使用read()、readline()或者readlines()读文本文件

>>> fin = open('relativity','rt')
>>> poem = fin.read()
>>> fin.close()
>>> len(poem)
167
>>> 

可设置最大的读入字符数限制read()函数一次返回的大小,然后把每一块拼接成原来的字符串

>>> poem=''
>>> fin = open('relativity','rt')
>>> chunk = 100
>>> while True:
         fragment = fin.read(chunk)  #read会记住已读取得位置
         if not fragment:  # 读到文件结尾之后,再次调用read()会返回空字符串(‘’),if not fragment条件被判为False
                   break
         poem += fragment

>>> fin.close()
>>> len(poem)
167

也可使用readline()每次读入文件的一行,通过追加每一行拼接成原来的字符串poem:

>>> poem = ''
>>> fin = open('relativity','rt')
>>> while True:
         line = fin.readline() #对一个文本文件,即使空行也有1个字符长度(换行字符’\n’)
         if not line:  #当line非空时,返回True,当文件读取结束,readline()返回空字符串,返回为False
                   break
         poem += line
>>> fin.close()
>>> len(poem)
167

读取文本文件最简单的方式是使用一个迭代器(iterator),它会每次返回一行。

>>> poem = ''
>>> fin = open('relativity','rt')
>>> for line in fin:
         poem += line
>>> fin.close()
>>> len(poem)
167
>>> 

函数readlines()调用时每次读取一行,并返回单行字符串的列表。

使用write()写二进制文件

如果文件模式字符串中包含’b’,那么文件会以二进制模式打开,这种情况下,读写的是字节而不是字符串。

>>> bdata = bytes(range(0,256))
>>> len(bdata)
256
>>> fout = open('bfile','wb')
>>> fout.write(bdata)
256
>>> fout.close()

使用read()读二进制文件

>>> fin = open('bfile','rb')
>>> bdata = fin.read()
>>> len(bdata)
256
>>> fin.close()

使用with自动关闭文件

忘记关闭已打开的文件,函数结束时会被关掉。Python的上下文管理器(context manager)会清理一些资源,例如打开的文件,应该强制剩下的所有写操作完成后再关闭文件。它的形式为:with expression as variable:

>>> with open(‘relativity’,’wt’) as fout:
        fout.write(poem)

完成上下文管理器的代码后,文件会被自动关闭

使用seek()改变位置

函数tell()返回距离文件开始处的字节偏移量,函数seek()允许跳转到文件其他字节偏移量的位置。

>>> fin = open('bfile','rb')
>>> fin.tell()
0
>>> fin.seek(255)
255

用第二个参数调用函数seek():seek(offset,origin)

如果origin等于0(默认为0),从开头偏移offset个字节;

如果origin等于1,从当前位置处偏移offset个字节;

如果origin等于2,距离最后结尾处偏移offset个字节;

这些值也在标准os模块中被定义:

>>> os.SEEK_SET
0
>>> os.SEEK_CUR
1
>>> os.SEEK_END
2
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值