Python基础第9课-文件读写
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) andos.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\x00scoreq\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() 关闭文件。关闭后文件不能再进行读写操作。 |
|
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) 将字符串写入文件,返回的是写入的字符长度。 |
|