文件读写是最常见的IO操作,python中内置了操作文件读写的函数,在读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件),本文将从下面三个方面介绍python中的文件IO

  1. 读文件操作
  2. 写文件操作
  3. StringIO和BytesIO操作

dtypesh函数_python

                                   读文件

        想要读取数据文件,首先我们要打开文件,这里需要使用python内置的open()函数来打开一个文件,创建一个file对象,

open()函数语法:

open(file_name,[,access_mode][,buffering])

参数的含义:

  • file_name:file_name变量是访问文件名称和字符串值。
  • access_mode:打开的方式,只读、写入、追加等,参数默认值为只读。
  • buffering:buffering为0,表示不会有寄存,为1,表示访问文件会寄存行,大于1,表示寄存区的缓冲大小,为负值,则寄存区的缓冲大小为系统默认。

不同模式打开文件的方式:

模式

描述

r

以只读方式打开文件,文件的指针将会放在文件的开头

w

文件存在,写入从开头编辑,原有内容覆盖,文件不存在,创建一个新的文件

a

文件存在,在文件末尾追加写入,文件不存在,创建一个新的文件

b

二进制模式

+

打开一个文件进行更新

示例:

方法1:
a=open('./file.txt','r')
print(a.read())
a.close()
[out]:'hello'
解析:文件打开成功,调用read()方法可以一次性读取文件的全部内容,
python把内容读到内存,用一个str对象表示。
之后调用close()方法关闭文件,文件使用之后必须关闭,因为文件对象会占用
操作系统的资源,并且操作系统同一时间能打开文件的数量也是有限的
方法2:
with open('./file.txt','r')as f:
    print(f.read())
[out]:'hello world'
解析:调用with语句可以自动关闭文件
注意1:二进制文件
前面的读取文件默认是文本文件,且编码的格式为'utf-8',
如果想要读取二进制文件,比如图片和视频等,又该如何操作
b=open('./file.jpg','rb')
print(b.read())
注意2:字符编码
要读取非utf-8编码的文件,此时就需要给open()函数传入encoding参数
c=open('./file.txt','r',encoding='gbk')
print(c.read())

dtypesh函数_python

                                       写文件

        对于文件的写入语法,其实和文件的读取相同,只需更改access_mode参数即可

示例:

方法1:
d=open('./file.txt','w')
d.write('hello shanghai')
d.close
方法2:
with open('./file.txt','a')as e:
    e.write('hello shanghai')

dtypesh函数_python

                             StringIO和BytesIO操作

有时候我们对数据的读取不一定是从文件中读取,也可以从内存中读写,而StringIO和BytesIO分别操作的是字符串数据和二进制数据

示例:

操作1:StringIO
from io import StringIO
f=StringIO()
f.write('hello world')
[out]:5
print(f.getvalue())
[out]:hello
操作2:BytesIO
from io import BytesIO
f=BytesIO()
f.write('上海',encode('utf-8'))
[out]:6
print(f.getvalue())

拓展使用

1、read()、readline()、readlines()三种读数据方法

f=open('./file.txt','r')
# 光标移动到第1个字符之后
f.seek(1)
# read是读取整个文件后面的所有字符,读完后,会把光标移动到你读完的位置
f.read()
# readline是读光标所在这一行的在光标后面的所有字符
f.readline()
# readlines和read类似,但把读的字符按行来区分做成了列表
f.readlines()

2、循环读取文件

方法1:
with open('./file.txt','r')as f:
for index,line in enumerate(f.readlines()):
    print(index,line.strip())
方法2:
for index,line in enumerate(f):
    print(index,line.strip())

3、对list、tuple、dict、set的文件操作

import pickle 
list1=[1,2,3]
# list文件的写入
a=open('./file.txt',mode='wb')
# 对于list列表形式,需要导入pickle模块,使用二进制模式wb写入
pickle.dump(list1,a)
a.close()
# list文件的读取
b.open('./file.txt',mode='rb')
print(pickle.load(b))
b.close()