python io流(8)

来源:互联网 发布:win10如何优化虚拟机 编辑:程序博客网 时间:2024/05/23 00:00

操作文件和目录

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

 

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

 

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

 

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

 

删除多个目录:os.removedirsrc\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.renameoldnew

 

创建多级目录:os.makedirsrc\python\test”)

 

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

 

获取文件属性:os.statfile

 

修改文件权限与时间戳:os.chmodfile

 

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

 

获取文件大小:os.path.getsizefilename

 

移动文件(目录)

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

 

复制文件:

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

shutil.copy("oldfile","newfile")          复制一个文件到一个文件或一个目录复制文件夹:

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

重命名文件(目录)

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

 

 

 

 

 

 

流的理解

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

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

 

流的分类

   按照流向

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

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

 

 

 

文件操作:

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

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

 

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

 

 

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

 

JSON数据结构

 

 

JSON有两种数据结构:

 

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

 

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

 

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

 

Xmljson作用: 不同的编程语言和不同平台之间传递数据

 

 

 

 

1.Map

 

 

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

 

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

 

 

 

以下为官网的图:

 

 

 

 

 

 

 

2.Array

 

 

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

 

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

 

以下为官网的图:

 

 

 

 

 

 

 

 

 

 

图中的value可以是:

 

 

 

 

 

总结:

 

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

 

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

 

(3)记住: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']))