IO 编程

    输入(Input)、输出(Output)

读写文件

操作系统提供文件视角 ----- 用户申请读写文件 ----- 操作系统准许后提供读写接口
 
        读文件
        f = open('/Users/michael/test.txt', 'r')
标示符'r'表示读 文件存在,则返回文件描述符; 文件不存在,抛出异常 IOError 
try:
f = open('/path/to/file', 'r')
print(f.read())
finally:
if f:
f.close()
但是每次都这么写实在太繁琐,所以,Python 引入了 with 语句来自动 帮我们调用 close() 方法:
with open('/path/to/file', 'r') as f:
print(f.read())
这和前面的 try ... finally 是一样的,但是代码更佳简洁,并且不必调 用 f.close() 方法。   如果文件很小, read() 一次性读取最方便; 如果不能确定文件大小,反 复调用 read(size) 比较保险; 如果是配置文件,调用 readlines() 比较方便;  
写文件
写文件和读文件是一样的,唯一区别是调用 open() 函数时,传入标识符 'w' 或者 'wb' 表示写文本文件或写二进制文件:
 f = open('/Users/michael/test.txt', 'w') 你可以反复调用 write() 来写入文件,但是务必要调用 f.close() 来关闭 文件。当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是 放到内存缓存起来,空闲的时候再慢慢写入。只有调用 close() 方法时, 操作系统才保证把没有写入的数据全部写入磁盘。忘记调用 close() 的 后果是数据可能只写了一部分到磁盘,剩下的丢失了。 同样也有with ... as .. with open('/Users/michael/test.txt', 'w') as f:
f.write('Hello, world!')

操作文件和目录

工作目录、相对路径、绝对路径
# 查看当前目录的绝对路径: >>> 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.rename('test.txt', 'test.py') # 删掉文件: >>> os.remove('test.py') os.path.split() 函数,可以把一个路径拆分为两部分,后一部分总 是最后级别的目录或文件名: >>> os.path.split('/Users/michael/testdir/file.txt') ('/Users/michael/testdir', 'file.txt') os.path.splitext() 可以直接让你得到文件扩展名,很多时候非常方便: >>> os.path.splitext('/path/to/file.txt') ('/path/to/file', '.txt')   最后看看如何利用 Python 的特性来过滤文件。 比如我们要列出当前目 录下的所有目录,只需要一行代码: >>> [x for x in os.listdir('.') if os.path.isdir(x)] ['.lein', '.local', '.m2', '.npm', '.ssh', '.Trash', '.vim', 'Applications', 'Desktop', ...] 要列出所有的 .py 文件,也只需一行代码: >>> [x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py'] ['apis.py', 'config.py', 'models.py', 'pymonitor.py', 'test_db.py', 'urls.py', 'wsgiapp.py']   实例:                        -------->31.py
#  列出目录下的所有文件(包括文件夹中的文件)
import os
def listfiles(dir,i):
for x in os.listdir(dir):
x=os.path.join(dir,x)
if os.path.isfile(x):
print((i-1)*"\t","|---",x,"-----file")
else:
print((i-1)*"\t","|---",x, " -------->dir")
listfiles(x,i+1)

listfiles("F:\pytest",0)
 
 
  

序列化

        内存、磁盘、程序运行过程  
我们把变量从内存中变成可存储或传输的过程称之为序列化,在 Python 中叫 pickling
序列化
Python 提供了 pickle 模块来实现序列化。 >>> import pickle >>> d = dict(name='Bob', age=20, score=88) >>> pickle.dumps(d) b'\x80\x03}q\x00(X\x03\x00\x00\x00ageq\x01K\x14X\x05\x00\x00\x00score q\x02KXX\x04\x00\x00\x00nameq\x03X\x03\x00\x00\x00Bobq\x04u.'  pickle.dump() 直接把对象序列化 后写入一个 file-like Object(什么是file-like object): >>> 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': 'Bob'} ---------------------------------------->32.py
序列化成JSON
Python 内置的 json 模块提供了非常完善的 Python 对象到 JSON 格式的 转换。我们先看看如何把 Python 对象变成一个 JSON:同样的dumps和load方法(dumps一个对象的时候,需要类内自定义一个class2dict方法print(json.dumps(s, default=student2dict)),或者使用lambda表达式   json.dumps(s, default=lambda obj: obj.__dict__) ) >>> import json >>> d = dict(name='Bob', age=20, score=88) >>> json.dumps(d) '{"age": 20, "score": 88, "name": "Bob"}' ---------------------------------------->33.py  
 

参考参数:

 
模式 描述
t 文本模式 (默认)。
x 写模式,新建一个文件,如果该文件已存在则会报错。
b 二进制模式。
+ 打开一个文件进行更新(可读可写)。
U 通用换行模式(不推荐)。
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
   
序号 方法及描述  
1

file.close()

关闭文件。关闭后文件不能再进行读写操作。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
 
2

file.flush()

刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。

 
3

file.fileno()

返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。

 
4

file.isatty()

如果文件连接到一个终端设备返回 True,否则返回 False。

 
5

file.next()

返回文件下一行。

 
6

file.read([size])

从文件读取指定的字节数,如果未给定或为负则读取所有。

 
7

file.readline([size])

读取整行,包括 "\n" 字符。

 
8

file.readlines([sizeint])

读取所有行并返回列表,若给定sizeint>0,则是设置一次读多少字节,这是为了减轻读取压力。

 
9

file.seek(offset[, whence])

设置文件当前位置

 
10

file.tell()

返回文件当前位置。

 
11

file.truncate([size])

截取文件,截取的字节通过size指定,默认为当前文件位置。

 
12

file.write(str)

将字符串写入文件,返回的是写入的字符长度。

 
     
 

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄