一:Python中读写文件的方法
1.open()函数
open(file,mode='r',buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)
- file : 是一个 path-like object,表示将要打开的文件的路径,可以是绝对路径也可以是相对路径,也可以是要被封装的整数类型文件描述符。如果是文件描述符,它会随着返回文件对象关闭而关闭,除非 closefd 被设为 False 。
- mode:文件打开的模式
'r':读取文件(默认)
'w':向文件写入,并先截断文件
'x' 排它性创建 一个文件,如果文件已经存在则失败
'a':在文件末尾追加写入
'b':二进制模式
't':文本模式(默认)
'+':可读也可以写
- buffering
buffering 是一个可选的整数,用于设置缓冲策略。
- 传递0以切换缓冲关闭(仅允许在二进制模式下)
- 选择行缓冲(仅在文本模式下可用),
- 并且>1的整数以指示固定大小的块缓冲区的大小(以字节为单位)。
- 如果没有给出 buffering 参数,则默认缓冲策略的工作方式如下:
- 二进制文件以固定大小的块进行缓冲;使用启发式方法选择缓冲区的大小,尝试确定底层设备的“块大小”或使用
io.DEFAULT_BUFFER_SIZE
。在许多系统上,缓冲区的长度通常为4096或8192字节。 - “交互式”文本文件(
isatty()
返回True
的文件)使用行缓冲。其他文本文件和二进制文件一样。
- encoding
encoding 是用于解码或编码文件的编码的名称。仅仅在文本模式下使用。默认编码是依赖于平台的(不管 locale.getpreferredencoding() 返回何值)。
可以使用任何Python支持的 text encoding 。有关支持的编码列表,请参阅 codecs 模块。
例如:
f=open('/Users/michael/notfound.txt', 'r')
f.read()
f.close()
2. with 关键字
在处理文件对象时,最好使用 with
关键字。
优点:
1.当子句体结束后文件会正确关闭,即使在某个时刻引发了异常也能关闭。
2.with
相比等效的 try
-finally
代码块要简短得多:
with open('workfile') as f:
read_data = f.read()
f.closed
3.文件对象的方法
f.read(size)
调用f.read(size)
读取文件内容,在文本模式下,它会读取一些数据并将其作为字符串返回,在二进制模式下,将数据作为字节串对象返回。
size是一个可选的数值参数。
- 当size被省略或者为负数时,将读取并返回整个文件的内容;
如果文件的大小是你的机器内存的两倍就会出现问题。
- 当取其他值时,将读取并返回至多size个字符(在文本模式下)或size个字节(在二进制模式下)。
- 如果已到达文件末尾,
f.read()
将返回一个空字符串 (''
)。
>>> f.read()
'This is the entire file.n'
>>> f.read()
''
f.readline()
读取文件的一行。如果到达文件的末尾就返回一个空的字符串。如果读取一个空行,就使用'n'
表示,即该字符串只包含一个换行符。
>>> f.readline()
'This is the first line of the file.n'
>>> f.readline()
'Second line of the filen'
>>> f.readline()
''
如果要逐行读取文件,也可以一下方法:
>>> for line in f:
... print(line, end='')
...
This is the first line of the file.
Second line of the file
f.write(string)
会把 string 的内容写入到文件中,并返回写入的字符数。:
>>> f.write('This is a testn')
15
在写入其他类型的对象之前,在文本模式下,需要先把它们转化为字符串,在二进制模式下,需要先把它们转化为字节对象
>>> value = ('the answer', 42)
>>> s = str(value) # convert the tuple to string
>>> f.write(s)
18
读写2进制文件(图片)
>>> f= open("./440.jpeg",'rb')>>> a=f.read()
>>> len(a)
11024>>> f2=open('./person.jpeg','wb')
>>> f2.write(a)
11024
f.tell()
f.tell()
返回一个整数,给出文件对象在文件中的当前位置,在二进制模式下为从文件开始的字节数,以及文本模式下从文件开始的字符数。
f.seek(offset, whence)
要改变文件对象的位置,请使用 f.seek(offset,
whence)
。 通过向一个参考点添加 offset 来计算位置;参考点由 whence 参数指定。
- whence 的 0 值表示从文件开头起算,
- 1 表示使用当前文件位置,
- 2 表示使用文件末尾作为参考点。
- whence 如果省略则默认值为 0,即使用文件开头作为参考点。
注意:在文本文件中,只允许相对于文件开头搜索
2进制文件
>>> f = open('workfile', 'rb+')
>>> f.write(b'0123456789abcdef')
16
>>> f.seek(5) # Go to the 6th byte in the file
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2) # Go to the 3rd byte before the end
13
>>> f.read(1)
b'd'
字符文件
>>> f.write("this is a txtn")
14
#刚写完文件所以在最后一位
>>> f.tell()
15
#读一个字节,为空字符串
>>> f.read(1)
''
#设置文件指针到位置0>>> f.seek(0)
0>>> f.tell()
0
#读一个字符
>>> f.read(1)
't'
>>> f.read(2)
'hi'
>>> f.tell()
3
>>> f.read()
's is a txtn'
>>> f.tell()
15
二:numpy中读写文件的方法
NumPy二进制文件(NPY,NPZ)
在python中有两种二进制文件:npy和npz文件,npy文件保存一个array,npz保存多个array,
并且可以指定关键字,默认的关键字是0,1,2.....
npy文件:
>>> np.save('/tmp/123', np.array([[1, 2, 3], [4, 5, 6]]))
>>> np.load('/tmp/123.npy')
array([[1, 2, 3],[4, 5, 6]])
npz文件:
>>> a=np.array([[1, 2, 3], [4, 5, 6]])
>>> b=np.array([1, 2])
>>> np.savez('/tmp/123.npz', a=a, b=b)
>>> data = np.load('/tmp/123.npz')
>>> data['a']array([[1, 2, 3],[4, 5, 6]])
>>> data['b']
array([1, 2])
>>> data.close()