python I/O编程

文件读写

读文件:open()、read()、close()。对于文件的操作一般都放在try ... except ... finally

一段完整的文件读取代码:

try:
    f = open(‘/path/to/file‘, ‘r‘)
    print(f.read())
finally:
    if f:
        f.close()

简写:

with open(‘/path/to/file‘, ‘r‘) as f:
    print(f.read())

简写的好处是:简洁,且不必调用close()方法。

read()一次读取全部内容,防止文件太大内存溢出,可以反复调用read(size)方法,每次最多读取size个字节内容。readline()一次读一行,readlines()一次读取所有内容并按行返回list。

open()返回的有个read()的对象,叫做file-like object。还可以是字节流,网络流,自定义流。它不要求从特定类继承,只要写个read()方法就成。

打开二进制文件需要一个b模式。

f = open(‘/path/to/file‘, ‘rb‘)
f.read()

读取非utf8的文本,需要给open()传入encoding参数。

f = open(‘/path/to/file‘, ‘r‘, encoding=‘gbk‘
f.read()

编码不规范的文件,open()函数可使用errors参数,遇到编码错误的处理一般是忽略

f = open(‘/path/to/file‘, ‘r‘, encoding=‘gbk‘, errors=ignore‘)

写文件:open()、write()、close()。和读文件一样。调用open()时,使用‘w‘或‘wb‘。

f = open(‘/path/to/file‘, ‘w‘)
f.write("hello, world")
f.close()

方式写文件的数据丢失,使用with语句:

with open(‘/path/to/file‘, ‘w‘) as f:
    f.write(‘hello, world‘)

写特殊编码的文件,使用open()函数传入encoding参数。

写内存流的时候使用StringIO和BytesIO

str写入StringIO,需要创建一个StringIO,然后写入。

from io import StringIO
f = StringIO()
f.write(‘hello world!‘)
print(f.getvalue())
hello world!

getvalue()获得写入后的str。

读取StringIO的内容

from io import StringIO
f = StringIO(‘hello\nHi\ngoodbye!)
while True:
    s = f.readline()
    if s == ‘‘:
        break
    print(s.strip())
    
hello
Hi
goodbye!

二进制的操作使用BytesIO

from io import BytesIO
f = BytesIO()
f.write(‘中文‘.encode(‘utf-8‘))

print(f.getvalue())
b‘\xe4\xb8\xad\xe6\x96\x87‘

读操作同StringIO()

文件和目录的操作

使用os和os.path模块。

os.name

os.uname()

os.environ

os.environ.get(‘PATH‘)

os.path.abspath(‘.‘)

把一个目录加入另一个目录

os.path.join(‘/path/to‘, ‘test‘)把test加入到to中

os.mkdir(‘/path/to/test‘)创建一个目录

os.rmdir(‘/path/to/test‘)删除一个目录

os.path.split(‘/path/to/test/test.txt‘)拆分一个文件的路径为绝对路径和一个文件名。

(‘/path/to/test‘, ‘test.txt‘)

os.path.splitext(‘/path/to/test.txt‘)

(‘/path/to/test‘, ‘.txt‘)

上面这些操作不要求目录或文件存在,只是对字符串的操作。

os.rename(‘test.txt‘, ‘test.py‘)文件改名

os.remove(‘test.py‘)删除文件

shutil模块提供了文件复制的函数copyfile()

序列化 -- pickling   反序列化 -- unpickling

其他语言称为 serialization,marshalling,flattening

序列化:就是把变量从内存中变成可存储或传输的过程。序列化之后可以把序列化后的内容写入磁盘,或传输。

反序列化:把变量内容从序列化的对象重新读到内存里。

序列化和反序列化实例:

import pickle
d = dict(name=‘bart‘, age=20, score=88)
pickle.dumps(d)

f = open(‘dump.txt‘, ‘wb‘)
pickle.dump(d, f)
f.close()

f = open(‘dump.txt‘, ‘rb‘)
d = pickle.load(f)
f.close()
d
{‘age‘:20, ‘score‘:88, ‘name‘:‘bart‘}

Json的操作 -- python中json比xml更快。

import json
d = dict(name=‘bart‘, age=20, score=88)
json.dumps(d)

json_str = ‘{"age":20, "score":88, "name":"bart"}‘
json.loads(json_str)
{"age":20, "score":88, "name":"bart"}

把一个对象序列化为一个json

import json

class Student(object):
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score
        
s = Student(‘bart‘, 20, 88)
# print(json.dumps(s)) typeerror

# 使用dumps的可选参数defalut把任意一个对象变成一个可序列化为json的对象。需要一个函数来转换。

def student2dict(std):
    return {
        ‘name‘: std.name,
        ‘age‘: std.age,
        ‘score‘: std.score
    }
    
print(json.dumps(s, default=student2dict))
{"age":20, "name":bart, "score":88}

# 把任意class变为dict:
print(json.dumps(s, default=lamba obj:obj.__dict__))    

# class的实例都有一个__dict__属性。除了__slots__的class

# 要把Json反序列化一个Student对象实例,loads()首先转换出一个dict对象,然后传入的object_hook函数负责把dict转换为Student实例:

def dict2student(d):
    return Student(d[‘name‘], d[‘age‘], d[‘score‘])

    
json_str = ‘{"age":20, "name": "bart", "score":88}‘
print(json.loads(json_str, object_hook=dict2student))
<__main__.Student object at 0x10cd3c190>
时间: 2024-10-04 00:13:50

python I/O编程的相关文章

Python 3 并发编程多进程之队列(推荐使用)

Python 3 并发编程多进程之队列(推荐使用) 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的. 可以往队列里放任意类型的数据 创建队列的类(底层就是以管道和锁定的方式实现): 1 Queue([maxsize]):创建共享的进程队列,Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递. 参数介绍: 1 maxsize是队列中允许最大项数,省略则无大小限制. 方法介绍: 1.主要

Python黑帽编程 3.4 跨越VLAN

Python黑帽编程 3.4 跨域VLAN VLAN(Virtual Local Area Network),是基于以太网交互技术构建的虚拟网络,既可以将同一物理网络划分成多个VALN,也可以跨越物理网络障碍,将不同子网中的用户划到同一个VLAN中.图2是一个VLAN划分的例子. 图2 实现VLAN的方式有很多种,基于交换设备的VLAN划分,一般有两种: l  基于交换机的端口划分 l  基于IEEE 802.1q协议,扩展以太网帧格式 基于第二层的VLAN技术,有个Trunking的概念,Tr

Python运维编程

Python运维编程 作者:Danbo  2015-10-11 什么是Python,为什么要使用Python? 这个大家自行谷歌,不过看看知乎你就知道Python有多么强大:http://www.zhihu.com/question/25038841  #大蟒蛇是人形自走跑有木有啊! 首先你要知道Python很强大.Python是一个胶水语言(Glue Language).与Perl最大的不同是Python开发的哲学是:用一种方法,最好是只有一种方法来做一件事,而Perl是:总是有多种方法来做同

python 入门 - 函数式编程

函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数 http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386819196283586a37629844456ca7e5a7faa9b94ee8000     函数 定义函数 def my_abs(x): if x >= 0: return x else: return -x result =my_

Python 3 并发编程多进程之进程同步(锁)

Python 3 并发编程多进程之进程同步(锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,竞争带来的结果就是错乱,如何控制,就是加锁处理. 1.多个进程共享同一打印终端 from multiprocessing import Process import os,time def work(): print('%s is running' %os.getpid()) time.sleep(2) print('%s is done' %os.g

Python 3 socket编程

Python 3 socket编程 一 客户端/服务器架构 互联网中处处是C/S架构 1.C/S结构,即Client/Server(客户端/服务器)结构 2.在互联网中处处可见c/s架构 比如说浏览器,在线视频,各种社交软件. C/S架构与socket的关系: 我们学习socket就是为了c/s架构的开发 学习socket一定要先学习互联网协议: 1.如何基于socket编程,来开发一款自己的C/S架构软件 2..C/S架构的软件(软件属于应用层)是基于网络进行通信的 3.网络的核心即一堆协议,

Python黑帽编程 3.1 ARP欺骗

Python灰帽编程 3.1 ARP欺骗 ARP欺骗是一种在局域网中常用的攻击手段,目的是让局域网中指定的(或全部)的目标机器的数据包都通过攻击者主机进行转发,是实现中间人攻击的常用手段,从而实现数据监听.篡改.重放.钓鱼等攻击方式. 在进行ARP欺骗的编码实验之前,我们有必要了解下ARP和ARP欺骗的原理. 3.1.1 ARP和ARP欺骗原理 ARP是地址转换协议(Address Resolution Protocol)的英文缩写,它是一个链路层协议,工作在OSI 模型的第二层,在本层和硬件接

Python黑帽编程2.1 Python编程哲学

Python黑帽编程2.1  Python编程哲学 本节的内容有些趣味性,涉及到很多人为什么会选择Python,为什么会喜欢这门语言.我带大家膜拜下Python作者的Python之禅,然后再来了解下Python的编程规范. 2.1.1 ZEND OF PYTHON 在Kali中启动终端,输入Python,进入交互模式. 图2 输入命令 import this “一首诗”呈现在我们眼前. 图3 内容如下: Beautiful is better than ugly.       优美胜于丑陋 Ex

Python黑帽编程2.7 异常处理

Python黑帽编程2.7 异常处理 异常是个很宽泛的概念,如果程序没有按预想的执行,都可以说是异常了.遇到一些特殊情况没处理会引发异常,比如读文件的时候文件不存在,网络连接超时.程序本身的错误也可以算作异常,比如把字符串当整数来处理,拼写错误. 不论是系统还是框架,都会对基本异常进行分类,比如IO异常,内存溢出等等.很多时候,针对特有的业务,我们也可以自定异常. 下面我们先看一个引发异常的例子: Print 'hello' 这个例子很简单,我们将print的首字母大写.这会引发一个错误: 图2

Python黑帽编程2.4 流程控制

Python黑帽编程2.4  流程控制 本节要介绍的是Python编程中和流程控制有关的关键字和相关内容. 2.4.1 if …..else 先上一段代码: #!/usr/bin/python # -*- coding: UTF-8 -*- x=int(input('请输入一个整数:')) if x==0: print '%d ==0' % x elif x<0: print '%d <0' % x else: print '%d >0' % x 这段代码使用if,elif和else三个