一 文件操做 (----------------------------------------------------------------------)python
一 介绍vim
计算机系统分为:计算机硬件,操做系统,应用程序三部分。数据结构
咱们用python或其余语言编写的应用程序若想要把数据永久保存下来,必需要保存于硬盘中,这就涉及到应用程序要操做硬件,众所周知,应用程序是没法直接操做硬件的,这就用到了操做系统。操做系统把复杂的硬件操做封装成简单的接口给用户/应用程序使用,其中文件就是操做系统提供给应用程序来操做硬盘虚拟概念,用户或应用程序经过操做文件,能够将本身的数据永久保存下来。app
有了文件的概念,咱们无需再去考虑操做硬盘的细节,只须要关注操做文件的流程:编辑器
#1. 打开文件,获得文件句柄并赋值给一个变量 #2. 经过句柄对文件进行操做 #3. 关闭文件
二 在python中函数
#1. 打开文件,获得文件句柄并赋值给一个变量 f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r #2. 经过句柄对文件进行操做 data=f.read() #3. 关闭文件 f.close()
三 f=open('a.txt','r')的过程分析工具
#一、由应用程序向操做系统发起系统调用open(...) #二、操做系统打开该文件,并返回一个文件句柄给应用程序 #三、应用程序将文件句柄赋值给变量f
文件句柄 = open('文件路径', '模式')
模式能够是如下方式以及他们之间的组合:测试
Character | Meaning |
---|---|
‘r' | open for reading (default) |
‘w' | open for writing, truncating the file first |
‘a' | open for writing, appending to the end of the file if it exists |
‘b' | binary mode |
‘t' | text mode (default) |
‘+' | open a disk file for updating (reading and writing) |
‘U' | universal newline mode (for backwards compatibility; should not be used in new code) |
#1. 打开文件的模式有(默认为文本模式): r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】 w,只写模式【不可读;不存在则建立;存在则清空内容】 a, 之追加写模式【不可读;不存在则建立;存在则只追加内容】 #2. 对于非文本文件,咱们只能使用b模式,"b"表示以字节的方式操做(而全部文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式) rb wb ab 注:以b方式打开时,读取到的内容是字节类型,写入时也须要提供字节类型,不能指定编码 #3. 了解部分 "+" 表示能够同时读写某个文件 r+, 读写【可读,可写】 w+,写读【可读,可写】 a+, 写读【可读,可写】 x, 只写模式【不可读;不存在则建立,存在则报错】 x+ ,写读【可读,可写】 xb
#掌握 f.read() #读取全部内容,光标移动到文件末尾 f.readline() #读取一行内容,光标移动到第二行首部 f.readlines() #读取每一行内容,存放于列表中 f.write('1111\n222\n') #针对文本模式的写,须要本身写换行符 f.write('1111\n222\n'.encode('utf-8')) #针对b模式的写,须要本身写换行符 f.writelines(['333\n','444\n']) #文件模式 f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式 #了解 f.readable() #文件是否可读 f.writable() #文件是否可读 f.closed #文件是否关闭 f.encoding #若是文件打开模式为b,则没有该属性 f.flush() #马上将文件内容从内存刷到硬盘 f.name
一: read(3):编码
1. 文件打开方式为文本模式时,表明读取3个字符操作系统
2. 文件打开方式为b模式时,表明读取3个字节
二: 其他的文件内光标移动都是以字节为单位如seek,tell,truncate
注意:
1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但不管哪一种模式,都是以bytes为单位移动的
2. truncate是截断文件,因此文件的打开方式必须可写,可是不能用w或w+等方式打开,由于那样直接清空文件了,因此truncate要在r+或a或a+等模式下测试效果
文件的数据是存放于硬盘上的,于是只存在覆盖、不存在修改这么一说,咱们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:
方式一:将硬盘存放的该文件的内容所有加载到内存,在内存中是能够修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)
import os with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f: data=read_f.read() #所有读入内存,若是文件很大,会很卡 data=data.replace('alex','SB') #在内存中完成修改 write_f.write(data) #一次性写入新文件 os.remove('a.txt') os.rename('.a.txt.swap','a.txt')
方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件
import os with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f: for line in read_f: line=line.replace('alex','SB') write_f.write(line) os.remove('a.txt') os.rename('.a.txt.swap','a.txt')
1. Lambda 函数
Lambda 函数是一种比较小的匿名函数——匿名是指它实际上没有函数名。
Python 函数一般使用 def a_function_name() 样式来定义,但对于 lambda 函数,咱们根本没为它命名。这是由于 lambda 函数的功能是执行某种简单的表达式或运算,而无需彻底定义函数。
lambda 函数可使用任意数量的参数,但表达式只能有一个。
2. Map 函数
Map() 是一种内置的 Python 函数,它能够将函数应用于各类数据结构中的元素,如列表或字典。对于这种运算来讲,这是一种很是干净并且可读的执行方式。
3. Filter 函数
filter 内置函数与 map 函数很是类似,它也将函数应用于序列结构(列表、元组、字典)。两者的关键区别在于 filter() 将只返回应用函数返回 True 的元素。
咱们不只评估了每一个列表元素的 True 或 False,filter() 函数还确保只返回匹配为 True 的元素。很是便于处理检查表达式和构建返回列表这两步。
4. Itertools 模块
Python 的 Itertools 模块是处理迭代器的工具集合。迭代器是一种能够在 for 循环语句(包括列表、元组和字典)中使用的数据类型。
使用 Itertools 模块中的函数让你能够执行不少迭代器操做,这些操做一般须要多行函数和复杂的列表理解。关于 Itertools 的神奇之处,请看如下示例:
5. Generator 函数
Generator 函数是一个相似迭代器的函数,即它也能够用在 for 循环语句中。这大大简化了你的代码,并且相比简单的 for 循环,它节省了不少内存。
好比,咱们想把 1 到 1000 的全部数字相加,如下代码块的第一部分向你展现了如何使用 for 循环来进行这一计算。
若是列表很小,好比 1000 行,计算所需的内存还行。但若是列表巨长,好比十亿浮点数,这样作就会出现问题了。使用这种 for 循环,内存中将出现大量列表,但不是每一个人都有无限的 RAM 来存储这么多东西的。Python 中的 range() 函数也是这么干的,它在内存中构建列表。
代码中第二部分展现了使用 Python generator 函数对数字列表求和。generator 函数建立元素,并只在必要时将其存储在内存中,即一次一个。这意味着,若是你要建立十亿浮点数,你只能一次一个地把它们存储在内存中!Python 2.x 中的 xrange() 函数就是使用 generator 来构建列表。
若是你想对列表进行屡次迭代,而且它足够小,能够放进内存,那最好使用 for 循环或 Python 2.x 中的 range 函数。由于 generator 函数和 xrange 函数将会在你每次访问它们时生成新的列表值,而 Python 2.x range 函数是静态的列表,并且整数已经置于内存中,以便快速访问。