Python数据类型:文件

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字符串)

使用文件

  • 基础操作提示
  1. 文件迭代器是最好的读取行工具
  2. 内容是字符串,not对象
  3. close()是通常选项(强烈建议)
  4. 文件是缓冲的并且时刻查找的
  • 实际应用中的代码演示(基础)
1
2
3
4
5
6
7
8
myfile = open('myfile.txt', 'w')
myfile.write('hello text file\n')
myfile.write('goodbye text file\n')
myfile.close()
myfile = open('myfile.txt')
myfile.readline()
myfile.readline()

写入操作并不替你加入字符串结束符"\n",若需要,手写。
默认文件操作模式是:'r'

Python 3中的文本和二进制文件

python总是支持文本和二进制文件,在python 3中:

  • 文本文件的内容表示成str字符串,执行Unicode编码和解码,默认值行末行转换;
  • 二进制文件内容表示成一个特殊bytes字符串类型,允许程序不修改的访问文件内容。

Python的编码稍后详解

  • 文件中存储并解析Python对象

摘要:取出文件中的详细文本内容,根据需要,使用相应的对象内置类型函数,如:int() str() list() dict() tuple()

进阶:

  1. pickle存储Python原生对象;

    pickle模块是能够让我们直接在文件中存储几乎任何Python对象的高级工具。

    1
    2
    3
    4
    5
    6
    7
    8
    import pickle
    D = {'name' : 'wk', 'age' : 18}
    F = open('datafile.pkl', 'wb')
    pickle.dump(D, F)
    F.close()
    F = open('datafile.pkl', 'rb')
    data = pickle.load(F)
  2. struct模块能够构造并解析打包的二进制数据;

    这里只给出示例,更多内容可以help(struct)

    1
    2
    3
    4
    5
    6
    7
    8
    import struct
    F = open('data.bin', 'wb')
    data = struct.pack('>i4sh', 7, 'wk', 5)
    F.write(data)
    F.close()
    F = open('data.bin', 'rb')
    data = F.read()

文件上下文

有两种方式处理:

  1. with as

    1
    2
    3
    with open(r'C:\misc\data.txt') as myfile:
    for line in myfile:
    ...
  2. try finally

    1
    2
    3
    4
    5
    6
    myfile = open(r'C:\misc\data.txt')
    try:
    for line in myfile:
    ...
    finally:
    myfile.close()
推荐使用:1

其他文件工具

open()函数及其得到的文件对象是Python脚本通向外部文件的主要接口,Python工具集中还有其他类似的文件工具。

  1. 标准流
    • sys模块中预先打开的文件对象
  2. os模块中处理的描述文件
  3. sockets pipes和FIFO文件
    • 文件类对象
  4. 键存取的文件
  5. Shell命令流

重访类型分类

Python所有实际中核心内置类型,具有共同的一些属性。首先根据类型的类别,给出对所有类型加以分类的列表:

对象类型 分类 是否可变
数字 数值
字符串 序列
列表 序列
字典 映射
元组 序列
文件 扩展 N/A
Sets 集合
frozenset 集合
bytearray(python 3) 序列
  • 对象根据分类可以共享操作;
  • 只有可变对象可以在原处修改;
  • Files export only methods,可变性并不适合文件类型的操作;
  • “数字”包含所有数字的类型;
  • 字符串包含str,以及Python 3中的bytesPython 2中的unicodePython 3中的bytearray字符串类型是可变的;
  • 集合类似一个无值的字典的键;
  • 所有类型都有可调用的method,通常特定于类型;

|对象灵活性|引用和拷贝|比较、一致性|

  • 列表、字典和元组可以包含任何种类的对象;
  • 列表、字典和元组可以任意嵌套;
  • 列表和字典可以扩大和缩小;

  • 直接赋值是引用;

  • L[:]可以复制列表,得到拷贝;
  • 字典D.copy()得到拷贝;
  • list(L)得到列表拷贝;
  • copy标准库模块:copy.deepcopy()可以拷贝对象内的所有元素;

  • "=="操作符测试值的相等性;

  • "is"表达式测试对象的一致性;

Python 3不支持数字混合类型的比较,字典的比较也比较特殊:
items字典method和内置的sorted()

1
2
list(D.items())
sorted(D.items())

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

  • 内置类型陷阱
  1. 赋值生成引用,not拷贝;
  2. 重复能够增加类型的层次深度;

    1
    2
    3
    L = [4, 5]
    X = L * 4
    Y = [L] * 4
  3. Beware of Cyclic Data Structures;

    1
    2
    3
    4
    L = ['xxxxx']
    L.append(L)
    L
    ['xxxxx', [...]]
  4. 不可变类型不可以在远处修改;