在读取文本的时候,Python可以识别所有的普通换行符并将其转换为单个的\n字符,类似的,在输出时会将换行符\n转换为系统默认的换行符 如果不希望这种默认的处理方式,可以给open传入参数newline=' '
print('要打印的东西',sep=',',end='!!\n') #以,为间隔以!!为结尾,换行
也可以用str.join()来完成同样的事情,str仅用来适用字符串
print(*row,sep='')
二进制I/O还有一个鲜为人知的特性及时数组和C结构体类型能直接被写入...不需要中间转化为自己对象.
6字符串的I/O操作:
使用操作类文件对象的程序来操作文本或二进制字符串
import io
s=io.StringIO()
s.write('Hello World\n')
s.getvalue()
io.StringIO只能用于文本,操作二进制数据,使用io.BytesIO类来替代,StringIO和BytesIO实例并没有正确的整数类型的文件描述符,因此它们不能用在那些需要使用真实的系统级文件如文件管道或者是套接字的程序中使用
7读写压缩文件
想读写一个gzip或bz2格式的压缩文件
import gzip
import bz2
gzip.open bz2.open
gzip bz2 可以作用在一个已存在并以二进制模式打开的文件上
f=open()
gzip(f,'rb') as g:***
8固定大小记录的文件迭代
想在一个固定长度或者数据块的集合上迭代,而不是在一个文件中一行一行的迭代
使用iter和functools.partial()函数
from functools import partial
with open() as f:records=iter(partial(f.read,RECORD_SIZE),'b')for r in records:....
records对象是一个可迭代对象,会不断产生固定大小的数据块..要注意的是如果总记录大小不是块大小的整数倍的话,最后一个返回元素的字节数会比期待值少
9读取二进制数据到可变缓冲区里
bytearray()
file.readinto()
10内存映射的二进制文件
问题:想内存映射一个二进制文件到一个可变字节数组中,目的可能是为了随机访问它的内容或者是原地做些修改
解决方案:使用mmap模块来内存映射文件
11文件路径名的操作
需要使用路径名来去获取文件名,目录名,绝对路径等
使用os.path模块中的函数来操作路径名,os模块知道Linux和Windows的差别
import os
path='/User/beazley/Data/data.csv'
os.path.basename(path)
os.path.dirname(path)
os.path.join('tmp','data',os.path.basename(path))
os.path.expanduser(path)
os.path.splitext(path)
对于任何的文件名的操作,都应该使用os.path模块,而不是使用标准的字符串操作来构造自己的代码.
12测试文件是否真的存在
os.path.exists('/etc/passwd')
os.path.isfile('/etc/passwd')
os.path.isdir('/etc/passwd')
os.path.islink('/usr/local/bin/python3')
os.path.realpath('/user/local/bin/python3')
还想获取元数据(比如文件大小或者是修改日期),也可以使用os.path模块来解决
os.path.getsize('/etc/passwd')
os.path.getmtime('/etc/passwd')
13获取文件夹中的文件列表
os.listdir('str') 字符串的startswith()和endswith()方法对于过滤一个目录的内容也是很有用的,对于文件名的匹配可能会使用glob或fnmatch
import glob
pyfiles=glob.glob('somedir/*.py')
from fnmatch import fnmatch
pyfiles=[name for name in os.listdir('somedir') if fnmatch(name,'*.py')]
获取目录中的列表是很容易的,但是其返回结果只是目录中实体名列表而已
14忽略文件名编码
想使用原始文件名执行文件的I/O操作,也就是说文件名并没有经过系统默认编码去解码或者编码过
sys.getfilesystemencoding()返回的文本编码来编码或者解码
15打印不合法的文件名
UnicodeEncodeError 异常和一条奇怪的消息 --surrogates not allowed
16不关闭文件改变文件的编码方式
io.TextIOWrapper是一个编码和解码Unicode的文本处理层,io.BufferedWriter是一个处理二进制数据的带缓冲的I/O层,io.FileIO是一个表示操作系统底层文件描述符的原始文件,增加或者改变文本编码会涉及增加或改变最上面的io.TextIOWrapper层
detach()方法会断开文件的最顶层并返回第二层..就可以给返回结果添加一个新的最顶层
19创建临时文件和文件夹
需要在程序执行时创建一个临时文件或者目录,并希望使用完之后可以自动销毁
tempfile tempfile.TemporaryFile ('w+t') 文本文件'w+t' 二进制文件'w+b' 创建的文件都是匿名的,甚至连目录都没有
NamedTemporary() 结果文件关闭时会被自动删除掉delte=False
TemporaryFile() NamedTemporaryFile() 和TemporaryDirectory() 函数是处理临时文件目录的最简单的方式,因为他们会自动处理所有的创建和清理步骤,在一个更低的级别,可以使用mkstemp() 和mkdtemp()来创建临时文件和目录
20与串行端口的数据通信
通过串行端口读写数据,典型场景就是和一些硬件设备打交道(比如说一个机器人或传感器) Python内置的I/O模块来完成这个任务,但对于串行通信的最好选择是使用pySerial包
21序列化Python对象
需要将一个Python对象序列化为一个字节流,以便将其保存到一个文件.存储到数据库或者通过网络传输它
pickle模块,将对象保存到一个文件中,pickle.dump pickle.dumps() 从字节流中恢复一个对象,使用pickle.load()或pickle.loads()