Python中文件IO操作

1、冯诺依曼体系

Cpu由运算器和控制器组成:

运算器,完成各种算数操作、逻辑运算、数据传输等数据加工处理。

控制器,控制程序的执行。

存储器,用于记忆程序和数据,例如内存。

输入设备,将数据或者程序输入到计算机中,例如键盘,鼠标。

输出设备:将计算机处理结果 展示给用户,例如显示器,打印机等。

2、一般说IO操作,指的是文件IO,如果指的是网络IO,那么就是网络IO操作。

 

3、文件IO常用操作

column

column

open

打开

read

读取

write

写入

close

关闭

readline

行读取

readlines

多行读取

seek

文件指针操作

tell

指针位置

4、打开操作

Open(file,mode=’r’,buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)

 

 

Open 打开一个文件,返回一个文件对象(流对象)和文件描述符,打开文件失败,返回异常。

基本使用:

f = open('test')
print(f.read())
f.close

文件操作中,最常用的操作就是读和写。

文件的访问模式也有两种:文本模式和二进制模式。不同模式,函数操作不尽相同,表现的结果也不一样。

 

5、poen的参数

1)file:

打开或者创建的文件名,如果不指定路径,默认是当前路径。

2)mode模式

描述字符

意义

r

缺省的,表示只是打开

w

只是写入的

x

创建并写入一个新的文件

a

写入打开,如果文件存在,则追加

t

缺省的,文本模式

+

读写打开一个文件,给原来只读、只写方式打开缺失的读或者写的能力

 

3)编码

Windows下面:GBK  CP936

Linux下面是:UTF-8

文件操作中,最常见的就是读和写。

文件访问的模式有两种:文本模式和二进制模式;不同模式下,函数的执行.

W特性是:没有的话创建,有的话直接覆盖。

Open默认是只读模式r打开已经存在的文件。

4)#基本练习

#只读的

f = open('test')  #等价于 f = open(‘open’,‘r’)
f.read()
# f.write('abc')
f.close()

#只写

f = open('test','w')
print(f.write('abc'))
f.close()

Print 输入3,显示的是输入的是三个字符。

 

5)总结

Open模式是只读模式r打开已经存在的文件。

(1)r

只读打开文件,如果使用write方法,会抛出异常

如果文件不存在,抛出FileNotFoundError异常

(2)w 

表示只写方式打开,如果读取则抛出异常。

如果文件不存在,则直接创建文件。

如果文件存在,则清空里面的内容。

(3)x

文件不存在直接创建。

文件存在的话直接抛出异常。

创建新文件是只写的。

f = open('test2','x')
#print(f.read())
print(f.write('abcd'))
f.close

 

(4) a

文件存在,只写打开,追加内容。

文件不存在,创建后,只写打开,追加内容。

f = open('test1','a')
# print(f.read())
f.write('abcd')
f.close()

(5)r  只读,wxa都是只写

wxa 都可以产生新文件;

w不管文件存在与否,都会生成全新内容的文件;

a不管文件是否存在,都能在打开的文件尾部追加;

x 必须要求文件事先不存在,自己造一个新的文件。

 

(6)文本模式t

字符流,将文件的字节按照某种字符编码理解,按照字符操作。Open的默认莫得就是rt。

默认都是文本字符。

 

(7)二进制模式b

字节流,将文件就按照字节理解,与字符编码无关,二进制模式操作时,字节操作使用beyes类型.

f = open('test1','rb')
s = f.read()
print(type(s))
print(s)
f.close()

控制台输出:

<class 'bytes'>

b'abcd'

f = open('test3','wb')
s = f.write("中国".encode())
print(s)
f.close()

控制台输出:

6

 

(8)+号模式功能

为r、w、a、x提供缺失的读写功能,但是,获取文件对象依旧按照r、w、a、x自己的特征。

+不能单独使用,可以认定他是为前面的模式做增强功能的。

f = open('test1','r+')
s = f.write('hijkl')
print(f.read())
f.close()

 

 

 

(9)b

里面是二进制字节,,其余是字符  

Read(参数列表)

文本模式下指的是字符。

二进制 下指的字节。

6、文件指针

上面的例子中,说明有一个指针。

1)     文件指针,指向当前字节的位置

mode=r,指针起始在0

mode=a,起始位置在EOF

tell()显示指针所在位置。指的是字节的偏移量。

seek(offset[,whence])  移动文件指针位置,offest偏移多少字节,whence是指在哪里开始。

2)文本模式下:

Whence为0的时候,文件开头向后偏移量。Offset只是接受正整数。

为1表示当前位置,offest只接受0

为2的时候表示从EOF开始,offest只接受0

3)二进制模式下:

Whence缺省值0,文件开头向后偏移,offest只是接受正整数。

为1表示当前位置,offest可以接受正负整数。

为2表示从EOF开始,offest可以接受正负整数。

二进制模式支持任意起点的偏移,从头、从尾,从中间位置开始,向后seek可以超界,但是向前就不可以,否则抛出异常.

 

f = open('test2','r+')
print(f.tell())
f.read()
print(f.tell())
f.seek(0)
print(f.read())

中文模式只是支持双字节便宜否则报错,因为中文都是双字节的、

7、buffering缓冲区

-1表示使用缺省大小的buffer,如果是二进制模式,使用io.DEFAULT_BUFFER_SIZE值。默认值4096或者8192.

如果是文本模式,如果是终端设备,是行缓存方式,如果不是,则使用二进制模式的策略。

0只在二进制模式使用,表示关buffer

1只在文本模式使用,表示行缓冲。遇到换行符的时候才flush。

大于1用于指定buffer。

 

buffer缓冲区:

缓冲区一个内存空间,一般来说是一个FIFO队列,到缓冲区满了或者达到阈值,数据才会到flush到磁盘。文本模式下不能关闭buffer。。

当缓冲区满了就该flush。

flush()将缓冲区数据写入磁盘。

close()关闭前会调用flush()

io.DEFAULT_BUFFER_SIZE缺省缓冲区大小、字节。

buffering

 

buffering=-1

t和b,都是io.DEFAULT_BUFFER_SIZE

buffering=0

b关闭缓冲区 t不支持

buffering=1

b就一个字节  t行缓冲,遇到换行符才flush

Buffering>1

B模式表示行缓冲从大小,缓冲的值可以超过io.DEFAULT_BUFFER_SIZE,直到设置的值超出后才把缓冲区flush

t 模式,是io.DEFAULT_BUFFER_SIZE

 

Buffering=-1    t和b都是size

Buffering=0     b关闭缓冲区  t没有

Buffering=1     b就一个字节   t行换成,遇到换行符才flush

Buffering>1     b模式表示行缓冲大小。

f = open('test4','w+b')
print(io.DEFAULT_BUFFER_SIZE)

 

 

 

 

 

总结:

1、文本模式中,一般都默认使用缓冲区大小。

2、二进制模式。是一个个字节的操作,可以指定buffer的大小。

3、一般来说,默认缓冲区大小就是个比较好的选择,除非明确知道,否则不调整。

4、一般编程中,明确知道需要写磁盘了,都会手动调用一次flush,而不是等到自动flush或者close。

 

 

 

 

 8、encoding

:编码,仅文本模式使用:

None表示缺省编码。依赖操作系统。Windows、linux下的如下代码。

Windows下缺省GBK()

Linux下缺省UTF-8

f = open('test2','w')
print(f.write('啊'))
# print(f.read())
f.close()

 

9、其它参数:

Errors:什么样的编码错误表示将被捕获。

None和strict表示有编码错误将抛出valueError异常,ignore表示异常。

10、Newline:

文本模式中,换行的转换,可以为None、空串””、’\r’、’\n’、’\r\n’

读时候,None表示’\r’,’\n’,’\r\n’都被转换为’\n’:”表示不会自动转换通用换行符,其它合法字符表表示换行符就是指定字符,就会按照指定字符分行。

写时,none表示’\n’都会被替换为系统缺省行分隔符os.linesep;’\n’或”表示’\n’不替换,其它合法字符表示’\n’会被替换为指定的字符。

 

 

 

11、Closedfd  

关闭文件描述符,True表示关闭。False会在文件关闭后保持这个描述符,fileobj.fileno()查看这个特性。

 

12、Read

 

Read(size=-1)  size表示读取的多少个字符或者字节,负数或者None表示读取到EOF

 

 

13、行读取:

Readline(size=-1)  一行行读取内容,size设置以后就按照要求设置的取几个字节或者字符。

 

Readlines(hint=1)

读取所有行的列表,指定hint()。

 

 

14、Write(写)

把字符串s写入到文件中并返回字符的个数

Writelines(lines),将字符串列表写入文件。

 

 

 

15、close

flush并关闭对象。

文件已经关闭,再次关闭没有任何效果。

 

16、其它

Seekable()是否可以seek

Readable()是否可读

Writable()是否可读

Closed是否已经关闭

 

17、上下文管理

1)异常处理,当出现异常的时候,拦截异常,但是,因为许多代码都可能出现OSError异常,不好判断因为资源限制产生的。

f = open('test')
try:
    f.write('abc')
finally:
    f.close()

使用finally可以保证打开的文件可以被关闭

 

2)上下文管理

一种特殊的语法,交给解释去去释放文件对象

with open('test') as f:
    f.write('abc')
   
f.closed
f1 = open('test')
with f1:
    f1.write('abc')
f.closed

 

With f:

文件管理就自持上下文管理,在退出with上下的时候,会调用close。

With open(‘test’) as f:

使用with ...as关键字。With...as不是函数。上下文管理的语句块并不会开启新的作用域。With语句块执行完的时候,会自动关闭文件对象。

对于类似于文件对象的IO对象,一般来说都需要在不使用的时候关闭、注销,以释放资源。

IO被打开的时候,会获得一个文件描述符,计算机资源是有限的,所以操作系统都会做限制,就是为了保护计算机的资源不要被完全的耗尽,资源是共享的,不是独占的。

一般情况下,除非特别声明情况下,不得提高资源的限制值来解决问题。

 

posted @ 2018-11-12 22:31  Python爱好者666  阅读(1855)  评论(0编辑  收藏  举报