文件和I/O
一、读写文本数据
(1)使用open()函数配合rt模式读取文本文件的内容;( t 为默认的文本模式)
(2)执行写入操作,使用wt模式,如果待操作文件已存在,会清除并覆盖其原先的内容;
(3)对已存在文件的结尾处追加内容,使用at模式;
(4)只在该文件不存在时,写入操作用x模式
(5)查询系统默认文本编码方式:sys.getdefaultencoding()
(6)不用with语句管理上下文,要记得手动关闭文件。
(7)换行符识别:UNIX:\n WINDOWS:\r\n MAC:\r。如果newline=None,则启用通用换行符模式。读取时将换行符转换成单独的\n字符,输出时换行符\n会被转换为当前系统默认的换行符。如果不想要这种翻译行为,设置newline=‘’ 即可。
(8)参数 errors是一个可选字符串,指定如何处理编码和解码错误 - 这不能在二进制模式下使用。‘ignore’,‘replace’等
二、输出重定向到文件中
with open('./hello.txt','wt',encoding='utf8') as f:
print('Hello World!',file=f)
三、以不同分隔符或行结尾符完成打印
使用end参数是在输出中进制打印出换行符的方式。
>>> print('ACME', 50, 99, sep=',')
'ACME',50,99
>>> print('ACME', 50, 99, sep=',', end='!!\n')
'ACME',50,99!!
>>> print(*row, sep=',')
四、读写二进制数据
使用open()函数的rb或者wb模式就可以实现对二进制数据的读或写。
当在做索引和迭代操作时,字节串会返回代表该字节的整数值而不是字符串。
(1)关于二进制I/O,像数组和C结构体这样的对象可以直接用来进行写操作,而不用先转换为byte对象。
适用于任何实现了缓冲区接口的对象。
import array
nums = array.array('i',[1,2,3,4,5,6])
with open('./data.bin','wb') as f:
f.write(nums)
(2)直接将二进制数据读入到他们底层的内存中,只要使用文件对象的readinto()方法即可。
nums = array.array('i',[0,0,0,0,0,0,0,0,0,0])
with open('./data.bin','rb',) as f:
f.readinto(nums)
# array('i', [1, 2, 3, 4, 5, 6, 0, 0, 0, 0])
readinto()是为已存在的缓冲区填充内容,而不是分配新的对象然后再将他们返回。
def read_into_buffer(filename):
buf = bytearray(os.path.getsize(filename))
with open(filename, 'rb') as f:
f.readinto(buf)
六、在字符串上执行I/O操作
需要模拟出一个普通文件时,使用StringIO和BytesIO类是最为适用的。
>>> import io
>>> s = io.StringIO()
>>> s.write('Hello World!!!\r\n')
>>> print('This is a test',file=s)
>>> s.getvalue()
Hello World!!!
This is a test >>> s = io.StringIO('Hexxxx HHHH')
>>> s.read(4)
Hexx >>> s = io.BytesIO()
>>> s.write(b'Hello World')
>>> s.getvalue()
b'Hello World'
七、读写压缩的数据文件
gzip和bz2模块用于处理压缩文件。默认的模式是二进制。压缩级别compressleve关键字指定,默认级别9,最高压缩等级。
import gzip,bz2
with gzip.open('./somefile.gz','rt') as f:
text = f.read() with bz2.open('./somefile.bz2','rt') as f:
text = f.read() with gzip.open('./somefile.gz','wt') as f:
f.write(text ) with bz2.open('./somefile.bz2','wt') as f:
f.write(text )
支持以二进制模式打开的文件进行叠加操作。
import gzip
f = open('somefile.gz', 'rt')
with gz.open(f, 'rt') as g:
text = g.read()
八、按固定大小进行迭代
对固定大小的记录或数据块进行迭代
from functools import partial
RECORD_SIZE = 32
with open('somefile.txt', 'rt') as f:
records = iter(partial(f.read, RECORD_SIZE), b'')
for r in records:
...
九、对二进制文件做内存映射
(1)先准备一个二进制文件
size = 100000
with open('data', 'wb') as f:
f.seek(size-1)
f.write(b'\x00')
(2)映射函数
import os
import mmap def memory_map(filename, access=mmap.ACCESS_WRITE):
size = os.path.getsize(filename)
fd = os.open(filename, os.O_RDWR)
return mmap.mmap(fd, size, access=access)
(3)读写操作
>>> m = memory_map('data')
>>> len(m)
100000
>>> m[0:10]
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>> m[0]
0
>>> m[0:11] = b'Heool World!'
>>> m.close()
(4)mmap()返回的mmap对象也可以当做上下文管理器使用。
with memory_map('data') as m:
print(len(m))
print(m[0:10])
(5)只读访问:mmap.ACCESS_READ;只在本地修改数据,不改写回原始文件:mmap.ACCESS_COPY
(6)对某个文件进行内存映射并不会导致将整个文件读到内存中。也就是说,文件并不会拷贝到某种内存缓冲区或数组上。
十一、处理路径名
找出基文件名、目录名、绝对路径等相关的信息。
(1)获取最后部分路径:
>>> os.path.basename(path) # path = /User/firefly/Data => 'Data'
(2)获取目录名字:
>>> os.path.dirname(path)
(3)组合路径:
>>> os.path.join('tmp', 'data')
(4)在Unix和Windows上,将参数中原始的~或~user部分用user主目录替换。
>>> os.path.expanduser(path) # path = '~/Data/firefly/Data/data.csv' => '/Users/beazley/...'
(5)分割文件扩展名:
>>> os.path.splitext(path) # ('~/Data/data', '.csv')
十二、检测文件是否存在
检测某个文件或者目录是否存在。
>>> os.path.exists('/etc/passwd')
isfile()、isdir()、islink()、realpath()、
检测文件大小或修改日期:
getsize()、getmtime()、
十三、获取目录内容列表
使用os.listdir()函数来获取目录中的文件列表。
import os
names = [ name for name in os.listdir('somedir') if os.path.isfile(os.path.join('somedir',name))]
names = [ name for name in os.listdir('somedir') if os.path.isdir(os.path.join('somedir',name))]
names = [ name for name in os.listdir('somedir') if name.endswith('.py')]
import glob
pyfiles = glob.glob('somedir/*.py')
from fnmatch import fnmatch
pyfiles = [name for name in os.listdir('somedir') if fnmatch(name, '*.py')]
十四、绕过文件名编码
>>> os.listdir(b'.') byte形式返回文件名
>>> with open(b'jalapen\xcc\x83o.txt') as f
十六、为已经打开的文件添加或修改编码方式
(1)为已经打开的二进制对象添加编码解码
import urllib.request
import io u = urllib.request.urlopen('http://www.baidu.com')
f = io.TextIOWrapper(u, encoding='utf8')
text = f.read()
(2)修改sys.stdout编码
>>> import sys,io
>>> sys.stdout.encoding
'UTF-8'
>>> sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding='latin-1')
>>> sys.stdout.encoding
'latin-1'
十七、将字节数据写入文本文件
(1)将原始字节写入到以文本模式打开 的文件中,只需将字节数据写入到文件底层的buffer中即可。
>>> sys.stdout.buffer.write(b'Hello\n')
十九、创建临时文件和目录
(1)创建临时文件
from tempfile import TemporaryFile
with TemporaryFile('w+t') as f:
f.write('Hello World\n')
f.write('Testing\n') f.seek(0)
data = f.read()
(2)保存创建的临时文件
from tempfile import NamedTemporaryFile
with NamedTemporaryFile('w+t',delete=False) as f:
print('filename is:', f.name)
(3)创建临时目录
from tempfile import TemporaryDirectory
with TemporaryDirectory() as dirname:
print('dirname is:', dirname)
二十一、序列化Python对象
(1)对象 =》文件
>>> pickle.dump(object, f)
(2)文件 =》 对象
>>> obj = pickle.load(data)
(3)对象 =》字符串
>>> s = pickle.dumps(object)
(4)字符串 =》 对象
>>> obj = pickle.loads(s)
某些特定类型的对象是无法进行pickle操作的。一般来说都涉及某种外部系统状态,如打开的文件、打开的网络连接、线程、进程、栈帧等
但是可以通过提供__getstate__()和__setstate__()方法来规避这些限制。
import time
import threading class Countdown: def __init__(self,n):
self.n = n
self.thr = threading.Thread(target=self.run)
self.thr.daemon = True
self.thr.start() def run(self):
while self.n >0:
print('T-minus', self.n)
self.n -= 1
time.sleep(5) def __getstate__(self):
return self.n def __setstate(self,n):
self.__init__(n)
试验:
>>> import countdown
>>> c = countdown.Countdown(30)
>>> T-minus 30
...
...
... >>> f = open('cstate.p', 'wb')
>>> import pickle
>>> pickle.dump(c, f)
>>> f.close()
退出Python,重新加载文件
>>> f = open('cstate.p', 'rb')
>>> pickle.load(f)
<countdown.Countdown object at 0x10069e2d0>
T-minus 19
T-minus 18
...
文件和I/O的更多相关文章
- Mapreduce的文件和hbase共同输入
Mapreduce的文件和hbase共同输入 package duogemap; import java.io.IOException; import org.apache.hadoop.co ...
- mapreduce多文件输出的两方法
mapreduce多文件输出的两方法 package duogemap; import java.io.IOException; import org.apache.hadoop.conf ...
- 01.SQLServer性能优化之----强大的文件组----分盘存储
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...
- SQL Server 大数据搬迁之文件组备份还原实战
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搬迁步骤(Procedure) 搬迁脚本(SQL Codes) ...
- SQLSERVER将一个文件组的数据移动到另一个文件组
SQLSERVER将一个文件组的数据移动到另一个文件组 有经验的大侠可以直接忽视这篇文章~ 这个问题有经验的人都知道怎麽做,因为我们公司的数据量不大没有这个需求,也不知道怎麽做实验 今天求助了QQ群里 ...
- SQL Server中的高可用性(2)----文件与文件组
在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...
- C# ini文件操作【源码下载】
介绍C#如何对ini文件进行读写操作,C#可以通过调用[kernel32.dll]文件中的 WritePrivateProfileString()和GetPrivateProfileString()函 ...
- 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用
有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
- GreenDao 数据库:使用Raw文件夹下的数据库文件以及数据库升级
一.使用Raw文件夹下的数据库文件 在使用GreenDao框架时,数据库和数据表都是根据生成的框架代码来自动创建的,从生成的DaoMaster中的OpenHelper类可以看出: public sta ...
随机推荐
- PHP中类成员的访问控制
类成员访问控制: 1.public 默认的,任何地方都可以访问,类内,类外,子类中 2.protected 受保护的,对外是封闭的,但是类内部和子类可以访问 3.private 私有的,仅限于本类中 ...
- wordpress 后台添加 快速编辑 栏目
前两篇其实是同一篇,都是讲在后台添加菜单类型的http://www.ashuwp.com/courses/highgrade/664.htmlhttps://shibashake.com/wordpr ...
- k8s-部署策略
在Kubernetes中有几种不同的方式发布应用,所以为了让应用在升级期间依然平稳提供服务,选择一个正确的发布策略就非常重要了. 选择正确的部署策略是要依赖于我们的业务需求的,下面我们列出了一些可能会 ...
- Docker系列5--一些问题及解决
1. 存储问题 1.1 挂载目录权限问题 在使用swarm创建服务的时候要挂载存储来获取运行文件,及写日志出去. 可运行文件相当于在集群中所有地方应该都能访问到,所以使用了NFS文件系统,在集群中所有 ...
- Luogu5284 十二省联考2019字符串问题(后缀树+拓扑排序)
对反串建SAM弄出后缀树,每个b串通过倍增定位其在后缀树上对应的节点,根据其长度将节点拆开.然后每个a串也找到对应的节点,由该节点向表示a串的节点连边,再把所给的边连上跑拓扑排序即可. #includ ...
- delete删除数据造成归档日志增加,操作系统空间不足导致数据库hang住
业务需求,对日志表历史数据进行清理.历史表均很大,使用delete 操作删除90天前的数据. 第一部分:快速删除数据 SQL> alter table CC.F_LOG parallel ; S ...
- 怎样使用wordpress模板建站
这里仅整理一个思路, 日后会详细补充. 1. 首先得下载 wordpress安装包, 上传到服务器上的 /var/www/html, 然后解压. 2. 然后安装apache 并启动, 启动一般是使用: ...
- 前端关于 superSlide.js 使用,一款基于jquery的前端控件
1引用jQuery.js 和 jquery.SuperSlide.js 2 编写HTML ** 以下是默认的HTMl结构,分别是 ".hd" 里面包含ul, ".bd&q ...
- Python练习_文件操作_day8
1. 1.作业 1,有如下文件,a1.txt,里面的内容为: 老男孩是最好的学校, 全心全意为学生服务, 只为学生未来,不为牟利. 我说的都是真的.哈哈 分别完成以下的功能: a,将原文件全部读出来并 ...
- 库克谈新iPhone不支持5G的理由,学习一下如何高手怎么应答
库克谈新iPhone不支持5G的理由 投递人 itwriter 发布于 2019-09-12 08:41 评论(14) 有1623人阅读 原文链接 [收藏] « » 9 月 12 日消息,苹果公司 C ...