Python学习笔记(九)IO编程

参考资料:https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386832151866c052395d62814708a14c4fa1c933d85e000

https://www.cnblogs.com/ydf0509/p/6825139.html

1、读写文件:读写文件是最常见的IO操作。Python内置了读写文件的函数,用法和C是兼容的。

(1)打开文件:Python内置的open()函数,传入文件名和读写操作标识符。常用的操作标识符包括:

  r - 只读  w-写 b-以二进制方式打开

如果要以指定编码格式打开文件,需要引用codecs模块,调用格式如下:

codecs.open(文件名,读写操作标识符,编码格式。

(2)读文件:成功执行open()函数后,Python返回一个文件操作对象f,使用f.read()方法即可读取文件内容。

(3)写文件:f.write()方法。

(4)关闭文件:f.close()。

以上给出了读写文件的步骤,为确保打开的文件最后均能关闭,需要以下两种方式来处理。

方式一:try...except...finally。例子代码如下:

try:
    f = open('qr.bmp', 'rb')
    print f.read()
except IOError, e:
    print 'error occured on executing open()', e.message
finally:
    if f:
        f.close()

方式二:使用with ...。例子代码如下:

with codecs.open('log.txt', 'rb', 'GBK') as f:
        print f.read()

2、操作系统接口函数。Python内置的os模块集成了操作系统相关操作接口函数。

(1)os.name:查看操作系统类型,如果是posix,说明系统是Linux、Unix或Mac OS X,如果是nt,就是Windows系统。

(2)os.environ:查看操作系统环境变量。

(3)os.getenv():获取指定的环境变量。

(4)os.path:集成了路径操作相关的方法。如os.path.abspath()返回全路径,os.path.join()实现路径的拼接,os.path.split将文件名拆分为目录和简单文件名,os.path.splitext将文件名拆分为文件名称和.开头的扩展名,os.path.isfile()判断给定的路径是否为文件名,os.path.isdir()判断给定的路径是否为目录等。

(5)os.mkdir():创建目录。

(6)os.rmdir():删除目录。

(7)os.rename():重命名文件。

(8)os.remove():删除文件。

另外,作为os模块的补充,shutil模块集成了很多使用函数,如copyfile()等。

下面是我的学习代码:

import os
#如果是posix,说明系统是Linux、Unix或Mac OS X,如果是nt,就是Windows系统。
s = os.name
if s == 'nt':
    print 'Windows System'
else:
    print 'Other System'
    print 'Details below:'
    print os.uname()
print 'all environment settings below'
print os.environ
print 'PATH settings below'
print os.getenv('PATH')
print 'current path:', os.path.abspath('.')
os.mkdir('test1')
os.rmdir('test1')
#定义一个方法,用于在指定路径下查找匹配的文件名
def findFile(root, match):
    #查找当前路径下的文件
    for f in os.listdir(root):
        if os.path.isfile(f):
           s = os.path.split(f)[1]
           #print os.path.abspath(s)
           if s.find(match) >= 0:
               print '%s\\%s' % (root, s)
        else:
           #查找各子目录下的文件
           if os.path.isdir(f):
               findFile(os.path.abspath(f), match)
findFile('.', 'test')

3、通过序列化实现对象的存取。

(1)Python提供两个模块来实现序列化:cPickle和pickle。这两个模块功能是一样的,区别在于cPickle是C语言写的,速度快,pickle是纯Python写的,速度慢。

(2)将对象序列化为字符串:pickle.dumps(对象)。该函数还提供许多附加参数,如:当需要序列化的内容包含中文时,需要设置ensure_ascii参数为False。

(3)将对象序列化为字符串并保存到文件:pickle.dump(对象,文件操作对象)。

(4)Python的json模块可以实现对象与json之间的序列化和反序列化。如果是dict对象,可直接使用json.dumps和json.load方法,如果是class对象,则需要传入该类与dict之间的自定义转化方法。

下面是我的学习代码:

try:
    import cPickle as pickle
except ImportError:
    import pickle
import json
d = dict(p1 = 'test', p2 = 1, p3 = None)
print pickle.dumps(d)
with open('d.txt', 'w') as f:
    pickle.dump(d, f)
with open('d.txt', 'r') as f:
    d = pickle.load(f)
    print d['p1']
#当需要序列化的内容包含中文时,需要设置ensure_ascii参数为False
print json.dumps(d, ensure_ascii=False)
class Student(object):
    def __init__(self, name, age, sex):
        self._name = name
        self._age = age
        self._sex = sex
def StudentToDict(student):
    return {
        'name': student._name,
        'age': student._age,
        'sex': student._sex
        }
s = Student('王小丫', 28, '女')
print json.dumps(s, ensure_ascii = False, default = StudentToDict)
#使用了lamda函数替换自定义转换函数
print json.dumps(s, ensure_ascii = False, default = lambda obj : obj.__dict__)
jsonStr = '{"name": "李勇", "age": 30, "sex": "男"}'
def DictToStudent(d):
    return Student(d['name'], d['age'], d['sex'])
print json.loads(jsonStr, object_hook=DictToStudent)
今天就学习到这里啦,下一节从进程学起。

猜你喜欢

转载自blog.csdn.net/alvin_2005/article/details/80387689