Python –同步IO学习笔记

Python –同步IO学习笔记

1. IO 分为Input和Output,以计算机逻辑模块为“本位”(一般说得就是内存),从外部设备传入数据到内存的过程就是Input,从内存传出到外部设备的过程就是Output。

2. IO分为同步IO和异步IO,本章讲的是同步IO。即在传输完成返回报告之前,发送端一直在等待信号的模式。(类似socket阻塞模式)。

文件读写:

1. open函数进行文件读写操作(也可以用file函数),例:

"""
#
保证文件最后关闭
try:
    f = open('E:/untitled/1.txt', 'r')#
'rb' #斜杠永远都是正确的,即使是在Windows环境下。
    print(f.read())
finally:
    if f:
        f.close()
"""

读文件用‘r’,写文件用‘w’。‘r+’和‘w+’均可以进行文件读写操作。

‘a’以追加模式打开文件,文件指针在末尾,‘a+’以读写模式打开文件,文件指针在末尾。加b’表示以二进制进行文件读写。


2. 文件必须要关闭(占用资源),但若出现错误须强制关闭,可用try…finally,推荐用with,with语句不只是针对文件而言的;它是一个用来创建运行时环境的通用框架(generic framework),告诉对象它们正在进入和离开一个运行时环境。如果该对象是流对象,那么它就会做一些类似文件对象一样有用的动作(就像自动关闭文件)。但是那个行为是被流对象自身定义的,而不是在with语句中。还有许多跟文件无关的使用上下文管理器(context manager)的方法。例:

"""
# with
自动调用close方法
with open('E:/untitled/1.txt', 'r', encoding='gbk', errors='ignore') as f:
    print(f.read(2))
"""


3. 操作文件对象的方法

(来自博客http://blog.csdn.net/cnmilan/article/details/9142561

f.close()     关闭文件,记住用open()打开文件后一定要记得关闭它,否则会占用系统的可打开文件句柄数。

f.fileno()     获得文件描述符,是一个数字

f.flush()      刷新输出缓存

f.isatty()     如果文件是一个交互终端,则返回True,否则返回False。

f.read([count])  读出文件,如果有count,则读出count个字节。

f.readline() 读出一行信息。

f.readlines()      读出所有行,也就是读出整个文件的信息。

f.seek(offset[,where])     把文件指针移动到相对于where的offset位置。where为0表示文件开始处,这是默认值 ;1表示当前位置;2表示文件结尾。

f.tell()  获得文件指针位置。

f.truncate([size])      截取文件,使文件的大小为size。

f.write(string)   把string字符串写入文件。

f.writelines(list) 把list中的字符串一行一行地写入文件,是连续写入文件,没有换行。


4. seek()和tell()方法总是以字节的方式计数,但是,由于你是以文本文件的方式打开的,read()方法以字符的个数计数。在存在中文情况下,不匹配

例:

with open('E:/untitled/1.txt', 'r+') as f:
   
#f.write('HelloDavid 你好 大卫')
   
print(f.read(13))
   
print(f.read())
   
print(f.seek(14))
   
print(f.tell())
   
print(f.read(14))
   
print(f.tell())

 

结果:

Hello David

大卫

14

14

大卫

21


5. 读取多行:

line_number = 0

with open('E:/untitled/1.txt', 'r') as a_file:

    for a_line in a_file:

        line_number += 1

      print('{:>4}{}'.format(line_number, a_line.rstrip()))

 

非文件来源的流对象:

只要对象包含read()方法,这个方法使用一个可选参数size并且返回值为一个串,它就是是流对象。

1.StringIO:

from io import StringIO

f
= StringIO()
f.write('Hello David')

print(f.getvalue())

______________________________________________________________

from io import StringIO
f
= StringIO('Hello\nDavid!')

while True:
   
s = f.readline()
   
if s == '':
       
break
   
print(s.strip())

2.BytesIO:

from io import BytesIO
f = BytesIO()
f.write('
中文'.encode('utf-8'))
print(f.getvalue())

--------------------------------------------------------------

from io import BytesIO
f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
print(f.read())    

 

处理压缩文件:

Python标准库包含支持读写压缩文件的模块。有许多种不同的压缩方案;其中,gzip和bzip2是非Windows操作系统下最流行的两种压缩方式。gzip模块允许你创建用来读写gzip压缩文件的流对象。该流对象支持read()方法(如果你以读取模式打开)或者write()方法(如果你以写入模式打开)。这就意味着,你可以使用从普通文件那儿学到的技术来直接读写gzip压缩文件,而不需要创建临时文件来保存解压缩了的数据。作为额外的功能,它也支持with语句,所以当你完成了对gzip压缩文件的操作,Python可以为你自动关闭它。例:

import gzip
with gzip.open('out.log.gz', mode='wb') as z:
   
z.write('Hello David!'.encode('utf-8'))

 

标准输入/输出/错误流(stdin/stdout/stderr):

sys.stdout和sys.stderr都是流对象,但是他们都只支持写入。试图调用他们的read()方法会引发IOError异常。

import sys
# 任何类只要实现了__enter____exit__都叫做上下文管理器
class RedirectStdoutTo(object):
   
def __init__(
self, out_new):
       
self.out_new = out_new

   
def __enter__(self):
       
self.out_old = sys.stdout
        sys.stdout
= self.out_new

   
def __exit__(self, *args):
       
sys.stdout = self.out_old

print('A')
# with open('out.log', mode='w', encoding='utf-8') as afile, #RedirectStdoutTo(afile):      
with open('out.log', mode='w', encoding='utf-8') as afile:
   
with
RedirectStdoutTo(afile):
       
print('B')
print('C')

①  这条代码会输出到ide的“交互式窗口(InteractiveWindow)”(或者终端,如果你从命令行运行这段脚本)。

②  这条with语句使用逗号分隔的上下文环境列表。这个列表就像一系列相互嵌套的with块。先列出的是“外层”的块;后列出的是“内层”的块。第一个上下文环境打开一个文件;第二个重定向sys.stdout到由第一个上下环境创建的流对象。

③  由于这个print()函数在with语句创建的上下文环境里执行,所以它不会输出到屏幕;它会写入到文件out.log。

④  with语句块结束了。Python告诉每一个上下文管理器完成他们应该在离开上下文环境时应该做的事。这些上下文环境形成一个后进先出的栈。当离开一个上下文环境的时候,第二个上下文环境将sys.stdout的值恢复到它的原来状态,然后第一个上下文环境关闭那个叫做out.log的文件。由于标准输出已经被恢复到原来的状态,再次调用print()函数会马上输出到屏幕上。

重定向标准错误的原理跟这个完全一样,将sys.stdout替换为sys.stderr即可。


参考网址:

http://old.sebug.net/paper/books/dive-into-python3/files.html

http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431917590955542f9ac5f5c1479faf787ff2b028ab47000

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值