Python 文件
内置open
函数可以创建一个python文件对象,对应操作系统上的一个文件链接。
操作文件
常见文件操作:
操作 | 解释 |
output = open(r'C:\spam', 'w') |
创建输出文件(’w’写入模式) |
input = open('data', 'r') |
创建输入文件(’r’读取模式) |
input = open('data') |
输入文件(’r’是默认值) |
string = input.read() |
整个文件读进一个字符串 |
string = input.read(N) |
读取之后的N个字节到一个字符串 |
string = input.readline() |
读取一行含有行末的标识符到一个字符串 |
list = input.readlines() |
读取文件的所有行到一个字符串列表 |
output.write(string) |
写入字节字符串到文件 |
output.writelines(list) |
列表内所有行写入文件 |
output.close() |
close |
output.flush() |
输出缓冲区刷到硬盘 |
anyFile.seek(N) |
修改文件读取位置到偏移量N处进行下一项操作 |
for line in open('data'): use line |
文件迭代器,一行一行读取 |
open('c.txt', encoding='latin-1') |
Python 3 Unicode文本文件(str字符串) |
open('c.bin', 'rb') |
Python 3二进制文件(bytes字符串) |
使用文件
- 基础操作提示
- 文件迭代器是最好的读取行工具
- 内容是字符串,not对象
close()
是通常选项(强烈建议)- 文件是缓冲的并且时刻查找的
- 实际应用中的代码演示(基础)
|
|
写入操作并不替你加入字符串结束符
"\n"
,若需要,手写。
默认文件操作模式是:'r'
Python 3中的文本和二进制文件
python总是支持文本和二进制文件,在python 3中:
- 文本文件的内容表示成
str
字符串,执行Unicode编码和解码,默认值行末行转换; - 二进制文件内容表示成一个特殊bytes字符串类型,允许程序不修改的访问文件内容。
Python的编码稍后详解
- 文件中存储并解析Python对象
摘要:取出文件中的详细文本内容,根据需要,使用相应的对象内置类型函数,如:int() str() list() dict() tuple()
进阶:
用
pickle
存储Python原生对象;pickle模块是能够让我们直接在文件中存储几乎任何Python对象的高级工具。
12345678import pickleD = {'name' : 'wk', 'age' : 18}F = open('datafile.pkl', 'wb')pickle.dump(D, F)F.close()F = open('datafile.pkl', 'rb')data = pickle.load(F)struct
模块能够构造并解析打包的二进制数据;这里只给出示例,更多内容可以
help(struct)
12345678import structF = open('data.bin', 'wb')data = struct.pack('>i4sh', 7, 'wk', 5)F.write(data)F.close()F = open('data.bin', 'rb')data = F.read()
文件上下文
有两种方式处理:
with as
123with open(r'C:\misc\data.txt') as myfile:for line in myfile:...try finally
123456myfile = open(r'C:\misc\data.txt')try:for line in myfile:...finally:myfile.close()
其他文件工具
open()
函数及其得到的文件对象是Python脚本通向外部文件的主要接口,Python工具集中还有其他类似的文件工具。
- 标准流
sys
模块中预先打开的文件对象
os
模块中处理的描述文件sockets pipes
和FIFO文件- 文件类对象
- 键存取的文件
- Shell命令流
重访类型分类
Python所有实际中核心内置类型,具有共同的一些属性。首先根据类型的类别,给出对所有类型加以分类的列表:
对象类型 | 分类 | 是否可变 |
数字 | 数值 | 否 |
字符串 | 序列 | 否 |
列表 | 序列 | 是 |
字典 | 映射 | 是 |
元组 | 序列 | 否 |
文件 | 扩展 | N/A |
Sets |
集合 | 是 |
frozenset |
集合 | 否 |
bytearray(python 3) |
序列 | 是 |
- 对象根据分类可以共享操作;
- 只有可变对象可以在原处修改;
- Files export only methods,可变性并不适合文件类型的操作;
- “数字”包含所有数字的类型;
- 字符串包含
str
,以及Python 3中的bytes和Python 2中的unicode;Python 3中的bytearray字符串类型是可变的; - 集合类似一个无值的字典的键;
- 所有类型都有可调用的method,通常特定于类型;
|对象灵活性|引用和拷贝|比较、一致性|
- 列表、字典和元组可以包含任何种类的对象;
- 列表、字典和元组可以任意嵌套;
列表和字典可以扩大和缩小;
直接赋值是引用;
L[:]
可以复制列表,得到拷贝;- 字典
D.copy()
得到拷贝; list(L)
得到列表拷贝;copy
标准库模块:copy.deepcopy()
可以拷贝对象内的所有元素;"=="
操作符测试值的相等性;"is"
表达式测试对象的一致性;
Python 3不支持数字混合类型的比较,字典的比较也比较特殊:items
字典method和内置的sorted()
|
|
Python的类型层次
Type对象
类型本身,在Python中也是对象类型。
In fact, even types themselves are an object type in Python: the type of an object is an object of type type
Python中的其他类型
除核心对象、内置类型以外,还将遇到函数、模块和类。
内置的类型有针对特殊类的语言生成语法,内置模块需先导入才可以使用:import os
- 内置类型陷阱
- 赋值生成引用,not拷贝;
重复能够增加类型的层次深度;
123L = [4, 5]X = L * 4Y = [L] * 4Beware of Cyclic Data Structures;
1234L = ['xxxxx']L.append(L)L['xxxxx', [...]]不可变类型不可以在远处修改;