Python3入门(十一)——IO编程

一、文件读写

  python的文件操作和C是兼容的

 1.读文本文件

 读文件操作如下:

f = open("F:/1.txt", "r")
data = f.read()
print(data)

  其中"r"表示read,读文件,再使用read()方法就把文件内容读取出来了

  和Java一样,操作文件需要close掉,并且强烈建议在finally中close,代码如下:

try:
    f = open("F:/1.txt", "r")
    data = f.read()
    print(data)
finally:
    if f:
        f.close()

  但是!Python这里又支持了with操作,这比Java必须要写上面类似的代码确实要简洁不少:

with open("F:/1.txt", "r") as f:
    print(f.read())

  这样,try finally以及close等全部可以省略了!

  这里read()也可以加参数size来限制读取的字节数,防止一次性读取太多而爆掉:

print(f.read(4))

  或者按行读取也是阔以的:

readline() # 读取一行
readlines() # 读取所有行,返回list
for line in f.readlines():
    print(line.strip()) # 把末尾的'\n'删掉

  这种带有read()方法的对象称为 file-like Object,常见的有StringIO

  2.读二进制文件

    使用rb模式打开即可:

f = open("F:/1.jgp", "rb")
f.read()

  3.字符编码

    默认是UTF-8,指定编码可以添加encoding参数

f = open("F:/1.txt", "r", encoding="GBK")
f.read()

     忽略一些乱七八糟的错误,可以使用errors

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

  4.写文件

    和读类似,w、wb进行文本文件、二进制文件的写,文件编码同读文件的操作

with open("F:/1_new.txt", "w") as f:
    f.write("Hello Python3!")

    w是覆盖写的形式,追加使用a参数,完整参照文档

二、StringIO与BytesIO

  1.StringIO

    在内存中读写string,称之为StringIO。它可以在内存中进行读写:

from io import StringIO

f = StringIO()
f.write("Hello ")
f.write("Python3!")
print(f.getvalue())

    可以像文件一样进行操作:

from io import StringIO

f = StringIO("Hello\nPython3!")
while True:
    line = f.readline()
    if line == "":
        break
    print(line.strip())

   2.bytesIO

f2 = BytesIO()
f2.write("我爱中国".encode("UTF-8"))

  注意这里写入的不是字符串string,而是经过编码后的bytes

三、操作文件和目录

  使用例如dir cp等操作文件的命令,可以通过Python的os模块来实现,底层是通过调用系统的接口进行具体实现的:

>>> import os
>>> os.name # 操作系统类型
'posix'——代表linux,nt代表windows,linux中还可以通过os.uname()来获取更加详细的信息

  1.获取环境变量:

>>> os.environ #查看所有环境变量
>>> os.environ.get('PATH') #获取特定变量

  2.操作文件和目录

    os.path中的部分操作:

# 查看当前目录的绝对路径:
>>> os.path.abspath('.')
'/Users/michael'
# 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来:
>>> os.path.join('/Users/michael', 'testdir')
'/Users/michael/testdir'
# 然后创建一个目录:
>>> os.mkdir('/Users/michael/testdir')
# 删掉一个目录:
>>> os.rmdir('/Users/michael/testdir')

  请注意路径的操作不要直接强行通过字符串拆分合并进行,而是使用os模块的方法!

  更多操作,参见相关文档

四、序列化

  python通过 pickle 模块进行序列化操作!

  pickle.dumps()方法把任意对象序列化成一个bytes,然后,就可以把这个bytes写入文件。或者用另一个方法pickle.dump()直接把对象序列化后写入一个file-like Object

>>> import pickle
>>> d = dict(name='Bob', age=20, score=88)
>>> pickle.dumps(d)

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

  反序列化方法通过load方法实现:

>>> f = open('dump.txt', 'rb')
>>> d = pickle.load(f)
>>> f.close()

  与JSON转换:

    类似Java的fastjson等对象与json的转换,python提供了json模块用来提供json字符串与dict的转换。好处与便利性不再赘述:

>>> import json
>>> d = dict(name='Bob', age=20, score=88)
>>> json.dumps(d)
#返回一个json的str字符串
'{"age": 20, "score": 88, "name": "Bob"}'

  类似的,也提供了镜像方法loads,返回与JSON对应的dict

>>> json.loads(json_str)

  JSON与对象的转换:

    上面介绍了默认的JSON字符串与dict的转换,当然肯定要有class对象与JSON的转换了:

    主要通过dumps()参数列表,实现一个class到dict的转换函数即可:

def student2dict(std):
    return {
        'name': std.name,
        'age': std.age,
        'score': std.score
    }

>>> print(json.dumps(s, default=student2dict))
{"age": 20, "name": "Bob", "score": 88}

 

posted @ 2018-04-25 18:03  ---江北  阅读(884)  评论(0编辑  收藏  举报
TOP