Python学习之旅(二十二)
Python基础知识(21):IO编程
一、文件读写
读写文件就是请求操作系统打开一个文件对象(文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)
1、读文件
“r”默认读取文本文件,“rb”读取二进制文件,如图片、视频等
>>> f=open("D:\Python\doit\hello.txt","r")
>>> f.read()
'Hello, world!'
>>> f.close()
(1)read()一次读取全部文件
read(size)一次最多读取size个字节长的内容
readline()每次读取一行内容
readlines()一次读取所有内容并返回list
(2)由于读取文件的过程中可能会出错,为保证无论有没有出错都能关闭文件,因而引用“try......finally......”
更为方便的办法是使用with
try:
f = open('/path/to/file', 'r')
print(f.read())
finally:
if f:
f.close() #with
with open('/path/to/file', 'r') as f:
print(f.read())
(3)读取utf-8文件时,需要给open()函数传入encoding参数
(4)遇到有些编码不规范的文件时会出现UnicodeDecodeError,此时只需要给open()函数传入error参数,直接忽略这个错误
2、写文件
写文件和读文件是一样的,唯一区别是调用open()函数时,传入标识符'w'或者'wb'表示写文本文件或写二进制文件
>>> f=open("D:\Python\doit\hello.txt","w")
>>> f.write("Everything will be fine.")
24
>>> f.close()
调用write()来写入文件,但是务必要调用f.close()来关闭文件。当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘
使用with语句确保数据被写入
with open('/Users/michael/test.txt', 'w') as f:
f.write('Hello, world!')
注:(1)要写入特定编码的文本文件,要给open()函数传入encoding参数,将字符串自动转换成指定编码
(2)如果要写入文件已存在,会直接覆盖(相当于删掉后新写入一个文件)。如果要把内容追加到文件末尾,可以传入'a'以追加(append)
二、StringIO和BytesIO
内存中读写str和bytes
1、StringIO:内存中读写str
要把str写入StringIO,需要先创建一个StringIO,像文件一样写入即可
getvalue()方法用于获得写入后的str
>>> from io import StringIO
>>> f = StringIO()
>>> f.write('hello')
5
>>> f.write(' ')
1
>>> f.write('world!')
6
>>> print(f.getvalue())
hello world!
要读取StringIO,可以用一个str初始化StringIO,像读文件一样读取
>>> from io import StringIO
>>> f = StringIO("Hey,\nguy.\nAre you OK?")
>>> while True:
s = f.readline()
if s == '':
break
print(s.strip()) Hey,
guy.
Are you OK?
2、BytesIO:内存中读写二进制
创建一个BytesIO,然后写入一些bytes
>>> from io import BytesIO
>>> f = BytesIO()
>>> f.write('中文'.encode('utf-8'))
6
>>> print(f.getvalue())
b'\xe4\xb8\xad\xe6\x96\x87
用一个bytes初始化BytesIO,然后,像读文件一样读取
>>> from io import BytesIO
>>> f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
>>> f.read()
b'\xe4\xb8\xad\xe6\x96\x87'
三、操作文件和目录
在Python语言中,操作文件和目录的函数一部分放在os模块中,一部分放在os.path模块中
# 查看当前目录的绝对路径:
>>> os.path.abspath('.')
'/path/file01'
# 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来:
>>> os.path.join('/path/file01', 'testdir')
'/path/file01/testdir'
# 然后创建一个目录:
>>> os.mkdir('/path/file01/testdir')
# 删掉一个目录:
>>> os.rmdir('/path/file01/testdir')
将两个路径合并成一个,通过os.path.join()函数
通过os.path.split()函数,把一个路径拆分为两部分,后一部分总是最后级别的目录或文件名
四、序列化
把变量从内存中变成可存储或传输的过程称之为序列化(pickling),序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上
把变量内容从序列化的对象重新读到内存里称之为反序列化(unpickling)
用pickle模块来实现序列化
pickle.dumps()方法把任意对象序列化成一个bytes,并把这个bytes写入文件。
pickle.dump()方法直接把对象序列化后写入一个file-like Object
JSON
要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式
JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输
Python学习之旅(二十二)的更多相关文章
- Python学习之旅(十二)
Python基础知识(11):高级特性 一.分片(切片) 通过索引来获取一定范围内的元素 #字符串 s="Alice" s[0:4:2] 结果: 'Ai' #列表 l=[1,2,3 ...
- Python学习笔记:(十二)输入输出
一.格式化输出 1.str.format()函数,格式化输出值 2.将输出值转变为字符串,可以使用repr()和str() str()函数将返回一个易读的表达式形式: repr()返回一个解释器易读的 ...
- Python学习笔记【第十二篇】:Python异常处理
什么是异常 异常就是程序运行时发生错误的信号,在python中,错误触发的异常如下 错误类型分为两种:语法错误和业务逻辑错. 异常的类型 AttributeError 试图访问一个对象没有的树形,比如 ...
- Python学习笔记(三十二)常用内建模块(1)— datetime
>>> from datetime import datetime >>> now = datetime.now() # 获取当前datetime >> ...
- 流畅python学习笔记:第十二章:子类化内置类型
子类化内置类型 在python2.2之后,内置类型都可以子类化,但是有一个注意事项:内置类型不会调用用户定义的类覆盖的特殊方法.这个说起来比较绕口,什么意思呢.我们来看下下面的代码: class Do ...
- python学习之【第十二篇】:Python中的迭代器
1.为何要有迭代器? 对于序列类型:字符串.列表.元组,我们可以使用索引的方式迭代取出其包含的元素.但对于字典.集合.文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭 ...
- Android使用局和数据实现天气项目-android学习之旅(十二)
1.首先注册聚合数据账号,下载相应的sdk 2.导入jar包和 so文件 配置Application,初始化sdk <application //自己新建的application类 androi ...
- Android四大组件之一Service介绍-android学习之旅(十二)
基本概念: service是android四大组件之一,运行在后台执行耗时操作,并不提供用户界面.其他组件如acticity可以通过startService启动该组件,也可以通过bindService ...
- Android广播接收器Broadcast Receiver-android学习之旅(十二)
首先继承BroadcastReceiver类,并在manifest中注册 public class MyReceiver extends BroadcastReceiver { public MyRe ...
- python学习之旅(十五)
Python基础知识(14):函数(Ⅴ) 一.装饰器 decorator:本质上就是函数,可以增强函数的功能. 定义起来虽然有点复杂,但使用起来非常灵活和方便 1.不修改被装饰函数的源代码 2.不修改 ...
随机推荐
- echarts-环形图处理图列中的点击,使百分比的数据列不发生变化,默认追加其他选项
将下列代码copy的echarts编辑器中 app.title = '环形图'; var $legendData = ['直接访问','邮件营销','联盟广告','视频广告','搜索引擎']; var ...
- bootstrap-3-上传图片-列表显示
效果 导入的js和css <!-- 最新版本的 Bootstrap 核心 CSS 文件 --> <link rel="stylesheet" href=" ...
- Java之线程池深度剖析
1.线程池的引入 引入的好处: 1)提升性能.创建和消耗对象费时费CPU资源 2)防止内存过度消耗.控制活动线程的数量,防止并发线程过多. 使用条件: 假设在一台服务器完成一 ...
- 为什么虚拟 dom 会提高性能?
虚拟 dom 相当于在 js 和真实 dom 中间加了一个缓存,利用 dom diff 算法避免了没有必要的 dom 操作,从而提高性能.用 JavaScript 对象结构表示 DOM 树的结构:然后 ...
- MySQL在INSERT IGNORE未新增记录时避免AUTO_INCREMENT自增
在MySQL5.7中做INSERT IGNORE时发现, 即使INSERT未成功执行, 表的自增主键却自动加1了, 在某些情况下需要避免这种行为. 需要修改的变量是 innodb_autoinc_lo ...
- 微信小程序tab切换,可滑动切换,导航栏跟随滚动实现
简介 看到今日头条小程序页面可以滑动切换,而且tab导航条也会跟着滚动,点击tab导航,页面滑动,切导航栏也会跟着滚动,就想着要怎么实现这个功能 像商城类商品类目如果做成左右滑动切换类目用户体验应该会 ...
- zabbix之微信告警(python版):微信个人报警,微信企业号告警脚本
微信个人告警脚本 微信个人告警:使用个人微信,发送到微信群组,微信好友 两个脚本执行: 1)能连接网络2)先执行server.py,扫描登录微信,登录之后没有报错,打开新终端查看端口是否起来了3)在z ...
- 【iCore4 双核心板_uC/OS-II】例程四:软件定时器
一.实验说明: 一些应用程序执行它们的任务时需要延迟一段特定的时间,因此uC/OS-II为我们提供了一些相应的 延时函数,本例程我们使用软件定时器定时500ms点亮相应的LED实现三色LED循环闪烁. ...
- 基于expressjs老项目的翻新方案
刚开始接触这方面的项目时,对ES规范理解不深,查了一些资料,发现如果不改expressjs的代码,大概率是没法用到最新的async/await了,后续也就没有继续往这个方面想. 这两天突然想起这个问题 ...
- MySQL 下载地址获取
http://cdn.mysql.com/Downloads/MySQL-5.7/mysql-5.7.26-winx64.msi 首先安装 mysql installer 安装器进行安装,之前会让你选 ...