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) 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)*" ","|---",x,"-----file")
else:
print((i-1)*" ","|---",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'x80x03}qx00(Xx03x00x00x00ageqx01Kx14Xx05x00x00x00score
qx02KXXx04x00x00x00nameqx03Xx03x00x00x00Bobqx04u.'
 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])

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

 
8

file.readlines([sizeint])

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

 
9

file.seek(offset[, whence])

设置文件当前位置

 
10

file.tell()

返回文件当前位置。

 
11

file.truncate([size])

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

 
12

file.write(str)

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

 
     
 
原文地址:https://www.cnblogs.com/MarmaladeCat/p/0b1b464cb62b4d4075cdc45770ab856a.html