文件
概念:文件对象只是常见文件处理任务输出模块。多数文件方法都与执行外部文件相关的文件对象的输入和输出有关,但其他文件方法可查找文件中的新位置、刷新输出缓存等。
常见操作:
打开文件
open('path','r')
处理模式:'r'代表输入打开文件(默认值),'w'代表为输出生成并打开文件,'a'代表为在文件尾部追加内容而打开文件。
在模式字符串尾部加上b可以进行二进制数据处理,尾部加上“+”意味着同时输入和输出打开文件(也就是说我们可以同时对相同文件对象进行读写,往往与对文件中的修改的查找操作配合使用)。
使用文件
Python程序中的文本文件都采用字符串的形式。
文件迭代器是最好的读取行工具
文件有个迭代器会自动地在for循环、列表解析或者其他迭代语句中对文件进行逐行读取
内容是字符串,不是对象
注意从文件读取的数据回到脚本时是一个字符串,同样,把数据写入文件时,Python不会自动把对象转换为字符串一一你必须传递一个已经格式化的字符串,因此(1).转换操作(int、float、str以及字符串格式化表达式)(2).处理一般对象的存储(例如,pickle模块)(3).处理文件中打包的二进制数据(例如,struct模块)这三种方式用于文本的处理。
close是通常选项
调用文件close方法将会终止对外部文件的连接
文件是缓冲的并且是可查找的
默认情况下,输出文件总是缓冲的,关闭一个文件,或者运行其flush方法,迫使缓存的数据进入硬盘。
Python文件也是在字节偏移的基础上随机访问的,它们的seek方法允许脚本跳转到指定的位置读取或写入。
实际应用中的文件
如果想要一行一行地扫描一个文本文件,文本迭代器往往是最佳选择:
在文件中存储并解析Python对象
上述读取内容均为字符串,我们需要把它们转换为真正的Python对象,鉴于Python不会自动把字符串转换为数字或其他类型的对象,如果我们需要使用诸如索引、加法等普通对象工具,就得这么做。
用pickle存储Python的原生对象
pickle模块是能够让我们直接在文件中存储几乎任何Python对象的高级工具,也并不要求我们把字符串转换来转换去。它就像是超级通用的数据格式化和解析工具。例如,想要在文件中存储字典,就直接用pickle来存储。
想要取回字典时,只要简单地再用一次pickle进行重建就可以了。
文件中包含二进制数据的存储与解析
struct模块能够构造并解析打包的二进制数据。从某种意义上说,它是另一个数据转换工具,它能够把文件中的字符串解读为二进制数据。
例如,要生成一个打包的二进制数据文件,用'wb'(写入二进制)模式打开它,并将一个格式化字符串和几个Python对象传给struct。
要将值解析为普通Python对象,可以简单地读取字符串,并使用相同格式的字符串把它解压出来就可以了。Python能够把值提取出来转换为普通的Python对象(整数和字符串)
引用vs拷贝
赋值操作总是存储对象的引用,而不是这些对象的拷贝。
因为赋值操作会产生相同对象的多个引用,需要意识到在原处修改可变对象时可能会影响程序中其他地方对相同对象的其他引用,这一点很重要,如果你不想这样做,就需要明确地告诉Python复制该对象。
生成的列表有三个引用:来自名字X,来自赋值为L的列表内部以及来自赋值为D的字典内部,关系图如下所示:
由于列表是可变的,修改这三个引用中任意一个共享列表对象,也会改变另外两个引用的对象。
引用是其他语言中指针的更高级模拟。虽然你不能抓住引用本身,但在不止一个地方存储相同的引用(变量、列表等)是可能的。这是一大特点:你可以在程序范围内任何地方传递大型对象而不必在途中产生拷贝。然而,如果你的确需要拷贝,那么可以明确需求。
(1).没有限制条件的分片表达式(L[:])能够复制序列
(2).字典copy方法(X.copy())能够复制字典
(3).有些内置函数(例如,list)能够生成拷贝(list(L))
(4).copy标准库模块能够生成完整拷贝。
这样一来,由其他变量产生的改变将会修改拷贝,而不是原对象。