(XWZ)的Python学习笔记Ⅴ——I/O编程
目录
IO编程
文件读写
读文件
写文件
StringIO和BytesIO
StringIO
BytesIO
操纵文件和目录
序列化
IO编程
文件读写
读文件
- 在对文件进行都写之前都需要先打开文件,返回一个文件对象(通常称为文件描述符),之后操作文件全用文件描述符。文件在使用完了以后还要关闭文件,避免其占用资源。读文件可以使用read()、readline()、readlines()。read()若不传入参数,则一次性将文件全部读完,若传入参数size则可以指定read(size)读取的字节数,read()返回一个字符串。readline()读取一行的内容。readlines()读取所有行的内容,返回一个list。用read()读取文件:
f = open('test2.py', 'r')t1 = f.read() print(t1)f.close()
运行结果为:
In [10]: runfile('F:/spyder_workspace/test2.py', wdir='F:/spyder_workspace') f = open('test2.py', 'r')t1 = f.read() print(t1)f.close()
用read(10)读取十个字节的数据:
f = open('test2.py', 'r')t1 = f.read(10) print(t1)f.close()
结果为:
In [14]: runfile('F:/spyder_workspace/test2.py', wdir='F:/spyder_workspace') f = open('
用readline()读取数据:
f = open('test2.py', 'r')t1 = f.readline() print(t1)f.close()
结果为:
In [15]: runfile('F:/spyder_workspace/test2.py', wdir='F:/spyder_workspace') f = open('test2.py', 'r')
用readlines()读取数据:
f = open('test2.py', 'r')contents = f.readlines() i = 1 for t in contents:print(i, '\t', t)i += 1 f.close()
In [16]: runfile('F:/spyder_workspace/test2.py', wdir='F:/spyder_workspace') 1 f = open('test2.py', 'r')2 3 contents = f.readlines()4 i = 15 for t in contents:6 print(i, '\t', t)7 i += 18 f.close()
- 有时文件读写会出错,抛出IOERROR错误,这时后面的f.close()就无法正常执行,导致文件无法关闭造成系统资源的浪费。为了解决这个问题,可以使用try...finally...代码块,将文件关闭操作放在finally代码块中,但这样书写起来显得过于复杂,所以python提供了with语句来自动帮我们调用close()方法:
with open('test2.py', 'r') as f:contents = f.readlines()i = 1for t in contents:print(i, '\t', t)i += 1
In [18]: runfile('F:/spyder_workspace/test2.py', wdir='F:/spyder_workspace') 1 with open('test2.py', 'r') as f:2 contents = f.readlines()3 i = 14 for t in contents:5 print(i, '\t', t)6 i += 1
还可以指定所读取文件采用的编码方式:
f = open('test.txt', 'r', ecoding = 'utf-8')
- 读取二进制文件:
f = open('test.txt', 'rb')
- 方法 seek()是用来移动文件指针,有两个参数,第一个是偏移量,第二个是相对位置(0表示文件头,1表示指针当前位置,2表示文件尾),若不是以二进制形式('b')打开的,该方法可能会运行出错!
- tell()方法可以显示当前文件指针的位置。
写文件
- 写文件和读文件是一样的,只不过在打开文件时,写文本文件用'w',写二进制文件用'wb',如果不是清空原先文件中内容,而是在文件末尾追加内容则用'a'。传入encoding参数可以指定以何种编码写入文本。使用write()或writelines()方法往文件中写数据:
f = open('doc.txt', 'w', encoding = 'utf-8') contents = ['\n','we ', 'are ', 'the ', 'best '] f.writelines(contents) f.close()
- 当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用
close()
方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()
的后果是数据可能只写了一部分到磁盘,剩下的丢失了。所以,还是用with
语句更保险。
StringIO和BytesIO
StringIO
- python提供了StringIO使得我们能够像操作文件一样操作字符串,这里的StringIO是对内存中的字符串进行“I/O”。读和写共用一个指针,因此write后再read没有意义,因此此时指针已定位到了最后。其使用方法见以下几个示例。
示例一:
# -*- coding: utf-8 -*-
from io import StringIOs = StringIO('hello world!')
content = s.read()
print(content)
运行结果为:
hello world!
示例二:
# -*- coding: utf-8 -*-
from io import StringIOs = StringIO()
s.write('hello world!\n')
s.write('we are the best!')
print(s.getvalue())
运行结果为:
hello world!
we are the best!
BytesIO
StringIO使得我们能够像操作文件一样操作str,而如果要操作二进制数据就要使用BytesIO,其用法和StringIO是类似的,只不过操作的是二进制数据:
from io import BytesIObs = BytesIO()
bs.write('hello world!'.encode('utf-8'))
print(bs.getvalue())
操纵文件和目录
python内置了os、os.path等模块实现对文件和目录的操作,其实就是对操作系统提供的系统调用接口进行了封装。
首先需要导入os模块:
import os
使用os.path.abspath(path)来查看path的绝对路径,'.'表示当前目录,'..'表示上一级目录:
In [105]: os.path.abspath('.')
Out[105]: 'F:\\spyder_workspace'
使用os.path.join(path1,path2)来将生两个路径合并成一个新路径名,虽然可以直接进行字符串合并,但这里不推荐:
In [113]: dir1 = os.path.join('F:\spyder_workspace', 'dir1')In [114]: dir1
Out[114]: 'F:\\spyder_workspace\\dir1'
使用os.mkdir(path)来创建一个目录:
In [117]: os.mkdir(dir1)
使用os.rmdir(path)来删除目录:
In [118]: os.rmdir(dir1)
使用os.path.split(path)和os.path.splitext(path)来拆分路径,前者能将文件所在目录的路径和文件名(包括扩展名)拆分开,后者是将文件名和扩展名拆分开:
In [117]: os.mkdir(dir1)In [118]: os.rmdir(dir1)In [119]: filename = 'F:\spyder_workspace\test2.py'In [120]: t1 = os.path.split(filename)In [121]: t1
Out[121]: ('F:\\', 'spyder_workspace\test2.py')In [123]: t2 = os.path.splitext(filename)In [124]: t2
Out[124]: ('F:\\spyder_workspace\test2', '.py')
使用os.listdir(path)可以列出path下的文件名:
In [131]: os.listdir('.')
Out[131]:
['$Recycle.Bin','AMTAG.BIN','bootmgr','BOOTNXT','Config.Msi','Documents and Settings','hiberfil.sys','Intel','pagefile.sys','PerfLogs','Program Files','Program Files (x86)','ProgramData','Recovery','swapfile.sys','System Volume Information','Temp','Users','Windows']
还有很多的函数如os.rename()对当前目录的文件重命名,os.remove()删除文件、os.path.isdir()、os.isfile()、os.chdir()等等。
序列化
序列化是指将对象转化为可存储或传输的字节序列的过程,其相反过程称为反序列化,将对象序列化后就能够存储到磁盘或通过网络进行传输。在python中通过pickle进行序列化。
import pickled = dict(name = 'Mike', age = 20, major = 'computer science')
f = open('doc.txt', 'wb')
#bt = pickle.dumps(d) #将对象d序列化
pickle.dump(d, f) #将对象d序列化后写入文件
f.close()
使用pickle.load()从file-like object中反序列化结果,或直接使用pickle.loads()直接将字节数据反序列化:
import picklef = open('doc.txt', 'rb')
d = pickle.load(f) #从文件中反序列化出对象
print(d)
f.close()
(XWZ)的Python学习笔记Ⅴ——I/O编程相关推荐
- Python学习笔记三之编程练习:循环、迭代器与函数
Python学习笔记三之编程练习 1. 编程第一步 # 求解斐波纳契数列 #/user/bin/python3#Fibonacci series:斐波那契数列 #两个元素的总和确定了下一个数 a,b= ...
- Python学习笔记·交互式图形编程
Python学习笔记·交互式图形编程 注:在校计算机学生一名,菜鸟一枚,最近开始学习Python的基础知识希望有什么不对的地方各位大佬能够不令赐教! 课程是在中国大学MOOC上学的,有兴趣的同学可以自 ...
- Python学习笔记:Io编程序列化
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:IO编程StringIO和BytesIO
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:面向对象编程(4)
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:面向对象编程(3)
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:面向对象编程(2)
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:面向对象编程(1)
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- 【廖雪峰Python学习笔记】面向对象编程OOP
面向对象编程 OOP:Object Oriented Programming 程序的基本单元:对象 [ = 数据 + 操作数据的函数] [属性 + 方法] 三大特点:数据封装.继承和多态 OPP中的计 ...
- 【廖雪峰Python学习笔记】函数式编程
Functional Programming 高阶函数 返回函数 匿名函数 装饰器 偏函数 高阶函数 面向过程的程序设计: 把大段代码拆成函数,通过一层层函数调用,可将复杂任务分解成若干简单的任务 函 ...
最新文章
- 知识产权界福布斯排行榜公布:厉害了,我的中国!
- Java的TheadLocal使用
- virtualbox安装centos7使用nat+hostonly的网络模式
- 4j 禁止类输出日志_logback 日志详细讲解
- WIN32_FIND_DATA
- 不玩游戏,855和730处理器在日常应用的速度差别有多大?
- 读懂mysql慢查询日志
- jquery 对象 和 js 对象 为什么要互相转换?_JQuery对象与dom对象两者之间的相互转换...
- POJ1700 Crossing River
- Convert.ToInt32、(int)和int.Parse 三者的区别 转
- mysql pxc集群介绍_MySQL中PXC集群的介绍
- C++多线程03 Lambda表达式与caII once
- 内核手动释放内存方法
- Android 图片处理工具类汇总
- 如何拿到互联网巨头的Offer
- 晶体(crystal)和晶振(oscillator)的区别
- 金额保留小数点后两位方法
- 【成为架构师课程系列】系统架构设计:非功能性目标的设计
- MySQL的while循环
- 今年Android面试有新要求,资深面试官口述了这几个点,android蓝牙开发教程