博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(XWZ)的Python学习笔记Ⅴ——I/O编程
阅读量:2173 次
发布时间:2019-05-01

本文共 4763 字,大约阅读时间需要 15 分钟。

目录

 


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 = 1for t in contents:    print(i, '\t', t)    i += 1f.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 = 1    for 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]: dir1Out[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]: t1Out[121]: ('F:\\', 'spyder_workspace\test2.py')In [123]: t2 = os.path.splitext(filename)In [124]: t2Out[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()

 

转载地址:http://rmhzb.baihongyu.com/

你可能感兴趣的文章
【Pyton】【小甲鱼】类和对象:一些相关的BIF(内置函数)
查看>>
【Pyton】【小甲鱼】魔法方法
查看>>
单元测试需要具备的技能和4大阶段的学习
查看>>
【Loadrunner】【浙江移动项目手写代码】代码备份
查看>>
Python几种并发实现方案的性能比较
查看>>
[Jmeter]jmeter之脚本录制与回放,优化(windows下的jmeter)
查看>>
Jmeter之正则
查看>>
【JMeter】1.9上考试jmeter测试调试
查看>>
【虫师】【selenium】参数化
查看>>
【Python练习】文件引用用户名密码登录系统
查看>>
学习网站汇总
查看>>
【Python】用Python打开csv和xml文件
查看>>
【Loadrunner】性能测试报告实战
查看>>
【自动化测试】自动化测试需要了解的的一些事情。
查看>>
【selenium】selenium ide的安装过程
查看>>
【手机自动化测试】monkey测试
查看>>
【英语】软件开发常用英语词汇
查看>>
Fiddler 抓包工具总结
查看>>
【雅思】雅思需要购买和准备的学习资料
查看>>
【雅思】雅思写作作业(1)
查看>>