python基础第七章IO流

 

 

操作文件和目录

python中对文件、文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块

 

得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd()

返回指定目录下的所有文件和目录名:os.listdir()

 

函数用来删除一个文件:os.remove()

 

删除多个目录:os.removedirs(r“c:\python”)

 

检验给出的路径是否是一个文件:os.path.isfile()

 

检验给出的路径是否是一个目录:os.path.isdir()

 

判断是否是绝对路径:os.path.isabs()

 

检验给出的路径是否真地存:os.path.exists()

 

返回一个路径的目录名和文件名:os.path.split()     eg os.path.split('/home/swaroop/byte/code/poem.txt') 结果:('/home/swaroop/byte/code', 'poem.txt')

 

分离扩展名:os.path.splitext()

 

获取路径名:os.path.dirname()

 

获取文件名:os.path.basename()

 

运行shell命令: os.system()

 

读取和设置环境变量:os.getenv() 与os.putenv()

 

给出当前平台使用的行终止符:os.linesep    Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'

 

指示你正在使用的平台:os.name       对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'

 

重命名:os.rename(old, new)

 

创建多级目录:os.makedirs(r“c:\python\test”)

 

创建单个目录:os.mkdir(“test”)

 

获取文件属性:os.stat(file)

 

修改文件权限与时间戳:os.chmod(file)

 

终止当前进程:os.exit()

 

获取文件大小:os.path.getsize(filename)

 

移动文件(目录)

shutil.move("oldpos","newpos")  

 

复制文件:

shutil.copyfile("oldfile","newfile")       oldfile和newfile都只能是文件

shutil.copy("oldfile","newfile")            oldfile只能是文件夹,newfile可以是文件,也可以是目标目录

复制文件夹:

shutil.copytree("olddir","newdir")        olddir和newdir都只能是目录,且newdir必须不存在

重命名文件(目录)

os.rename("oldname","newname")       文件或目录都是使用这条命令

 

 

 

 

 

 

流的理解

   IO 编程中,Stream(流)是一个很重要的概念,可以把流想象成一个水

管,数据就是水管里的水,但是只能单向流动

 

流的分类

   按照流向

1  Input Stream   就是数据从外面(磁盘、网络)流进内存,

2  Output Stream   就是数据从内存流到外面去  

 

 

 

文件操作:

os.mknod("test.txt")        创建空文件

fp = open("test.txt",w)     直接打开一个文件,如果文件不存在则创建文件

 

关于open 模式:

 

w     以写方式打开,

a     以追加模式打开 (从 EOF 开始, 必要时创建新文件)

r+     以读写模式打开

w+     以读写模式打开 (参见 w )

a+     以读写模式打开 (参见 a )

rb     以二进制读模式打开

wb     以二进制写模式打开 (参见 w )

ab     以二进制追加模式打开 (参见 a )

rb+    以二进制读写模式打开 (参见 r+ )

wb+    以二进制读写模式打开 (参见 w+ )

ab+    以二进制读写模式打开 (参见 a+ )

 

 文件读取

 

   1 读

 使用 Python 内置的 open() 函数,传入文件名和标示符:

     f = open('d:/a.txt', 'r')

注意:

    1  标示符'r'表示读  文件不存在, open() 函数就会抛出一个 IOError 的错误

 

2 文件打开成功Python 把内容读到内存,用一个 str 对象表示

 

3 调用 close() 方法关闭文件 因为文件对象会占用操作系统的资源  f.close()

4 文件读写时都有可能产生 IOError ,一旦出错,后面的 f.close() 就不会调用,解决方案1 使用 try ... finally 来实现  2  引入了 with 语句来自动 帮我们调用 close()(建议)

如: with open('/path/to/file', 'r') as f:

print(f.read())

 

5 f.read()不适合大文件如果10g,加载到内存,内存就爆了  用read(size) 方法,每次最多读取size 个字节的内容。另外,调用 readline() 可以每次读取一行内容

 for line in f.readlines():

print(line.strip()) # 把末尾的'\n'删掉

 

    6 要读取非UTF-8编码的文本文件,需要给 open() 函数传入 encoding 参数,

例如,读取 GBK 编码的文件:

>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')

>>> f.read()

 

 

2 写

写文件和读文件是一样的,唯一区别是调用 open() 函数时,传入标识符

'w' 或者 'wb' 表示写文本文件或写二进制文件:

  注意:

1 务必要调用 f.close() 来关闭文件 ,只有调用 close() 方法时,操作系统才保证把没有写入的数据全部写入磁盘

 

 

 

StringIO 和 和 BytesIO

   数据读写不一定是文件,也可以在内存中读写

 

 1   StringIO 顾名思义就是在内存中读写 str。

 from io import StringIO

>>> f = StringIO()

>>> f.write('hello')

5

>>> f.write(' ')

1

>>> f.write('world!')

6

>>> print(f.getvalue())

hello world!

 

  以用一个 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!

 

 

  

 

 2   StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO

     from io import BytesIO

>>> f = BytesIO()

>>> f.write('中文'.encode('utf-8'))

6

>>> print(f.getvalue())

b'\xe4\xb8\xad\xe6\x96\x87'

请注意,写入的不是 str,而是经过 UTF-8 编码的 bytes。

和 StringIO 类似,可以用一个 bytes 初始化 BytesIO,然后,像读文件一

样读取:

>>> from io import StringIO

>>> f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')

>>> f.read()

b'\xe4\xb8\xad\xe6\x96\x87'

 

 

 

 

Xml 和json

    XML 指可扩展标记语言(eXtensible Markup Language)。

XML 被设计用来传输和存储数据,和配置

XML 很重要,也很容易学习

 

Json

JSON(JavaScript Object Notation),类似于XML,是一种数据交换格式,比如JAVA产生了一个数据想要给JavaScript,则除了利用XML外,还可以利用JSON;

 

JSON相比XML的优势是表达起来很简单;

 

 

JSON是AJAX中的X(就是可以取代XML);          ------出自JSON创始人;

 

JSON数据结构

 

 

JSON有两种数据结构:

 

(1)Map,也称为对象;{....}

 

(2)Array;[......]

 

也就是说所有的JSON对象都是要以这些形式表示;

 

Xml,json 作用: 不同的编程语言和不同平台之间传递对象

 

 

 

 

1.Map

 

 

简单的说就是Java中的Map,名称-值对的形式给出,名称和值之间用“:”隔开,两个Map之间用“,”隔开,一般表示形式如下:

 

{'key1':'value1','key2':'value2'}

 

 

 

以下为官网的图:

 

 

 

 

 

 

2.Array

 

 

就是普通意义上的数组,一般形式如下:

 

['arr1','arr2','arr3'];

 

以下为官网的图:

 

 

 

 

 

 

 

 

 

图中的value可以是:

 

 

 

 

总结:

 

(1)JSON的数据结构只有两种;

 

(2)可以嵌套表示,比如Array中可以嵌套Object等;

 

  1. 记住:Object是以{}表示,Array是以[  ]表示;

 

 

 

解析和生成

   生成

   Python 内置的 json 模块提供了非常完善的 Python 对象到 JSON 格式的

转换。我们先看看如何把 Python 对象变成一个 JSON:

>>> import json

>>> d = dict(name='Bob', age=20, score=88)

>>> json.dumps(d)

'{"age": 20, "score": 88, "name": "Bob"}'

dumps() 方法返回一个 str ,内容就是标准的 JSON

 

 

 

 

解析

  要把 JSON 反序列化为 Python 对象,用 loads() 或者对应的 load() 方法,

前者把 JSON 的字符串反序列化

  json_str = '{"age": 20, "score": 88, "name": "Bob"}'

>>> json.loads(json_str)

{'age': 20, 'score': 88, 'name': 'Bob'}

 

  JSON 标准规定 JSON 编码是 UTF-8,所以我们总是能正确地在

Python 的 str 与 JSON 的字符串之间转换

 

 

对象序列化和反序列化

 

 

1 对象序列化:把对象转换成数据

 import json

class Student(object):

def __init__(self, name, age, score):

self.name = name

self.age = age

self.score = score

 

 

s = Student('Bob', 20, 88)

jsondate  = json.dumps(s, default=lambda obj: obj.__dict__) (建议)

 

2 对象反序列化: 把数据转换成对象

  如果我们要把 JSON 反序列化为一个 Student 对象实例,

loads() 方法首先转换出一个 dict 对象,然后,我们传入的 object_hook

函数负责把 dict 转换为 Student 实例:

 

student= json.loads(jsondata, object_hook=lambda d: Student(d['name'], d['age'], d['score']))

 

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值