python一切皆对象,linux一切皆文件,python操作文件是很常见的O/I操作,其内置来open()函数可以完成文件的基本操作:

一:使用内置open()函数操作文件,基本语法如下:

with   open("test.log","r") as f: #文件的打开模式为只读r
a = f.readlines() #一次读取文件的所有行放入内存
print(a) #显示读取到的文件全部内容
print(type(a)) #显示读到的文件内容是列表,也就是要多读取到的内容做操作,需要使用列表的操作方法
#with语句会自动关闭文件,因此不需要使用f.close来关闭文件了

以下是文件打开时的模式,不同打开模式有不同的操作方法:

r:以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。

r+:打开一个文件用于读写,文件指针将会放在文件的开头,此方法适用于在开头增加数据,如果要在末位添加数据本方法不适合,。

rb:以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。

rb+: 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。

r打开方式总结:无论是是以r还是r+还是rb打开文件,指针都在文件的开头,r+可以读写文件,rb+以二进只读写方式打开文件

w打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

w+:打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

wb:以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

wb+:以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

w打开文件方式总结:w方式可以读写文件,如果文件不存在都会创建,但是如果文件存在则会覆盖原文件内容,指针会在文件首部,因此不适用于操作有数据的文件。

a: 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入,a不能读文件

ab: 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

a+:打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写,a与a+的区别是a不能读只能追加,a+可以读写。

ab+:以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

a打开文件总结:a用于在末位追加,但是不能读,ab以二进制操作,a+可以读写,如果见不存在就创建,存在则将指针放在末位,ab+出使用二进制以外同a,凡是操作加上+都可以读写。

r+U:在读文件的时候只以 \n 做换行符,U只能和r搭配使用,其他环境不能使用

二:open()内置函数的常用方法:

以下方法基于python2.7.10,python3大同小异:

假如有个文件,内容如下:

你好!
!nihao
!你好
现在使用open()函数的方法来操作打开此文件:

1.readline(self,size=None):一次读取一行数据到内存,如果要读取多行需要配合next()方法:

 with   open("test.log","r") as f: #文件的打开模式为只读r
a = f.readline() #一次读取文件的所有行放入内存
print(a) #显示读取到的文件内容是一行
print(type(a)) #显示读到的文件内容是列表,也就是要多读取到的内容做操作,需要使用列表的操作方法 执行结果:
你好! <class 'str'>

readline

2.readlines(self,size=None):读取全部文件内容到内存,并按每行一个元素组成为一个列表,元素后面有换行符:

  with   open("test.log") as f:
#print(f.readline()) for a in f.readlines(): #读取全部文件内容到内存,然后利用for循环遍历文件内容
print(a)
print(type(a)) 执行结果:
你好! !nihao !你好
<class 'str'>

readlines

3.close(self)  #关闭文件,with方法不需要关闭文件

4.flush(self): #刷新文件内部缓冲区,并不能将程序缓存和系统缓存完全写入硬盘

5.isatty(self): #判断文件是否同一个系统文件,根据tty

6.next(self): #执行一行取出来,再次执行就去下一行

7.read(self, size=None): #将文件一次性加载到内存,可以加数字表示读多少字节

8.readinto(self): #读到缓冲区,即将废弃,不要使用

9.seek(self, offset, whence=None): #设置光标位置

10.tell(self): #返回当前的光标位置

11.truncate(self, size=None): #保留光标之前的数据,删除光标之后的数据

12.write(self, p_str): #写文件,只写一个 字符串

13.writelines(self, sequence_of_strings): #可以将一个列表一次写入文件

14.xreadlines(self): #每次只读一行,即将废弃

15.fileno(self): 显示文件的底层描述符

三:python的json模块:

json的全称是(JavaScript Object Notation),json是一种文档语言,类似于xml是一种文档语言,python中的json模块的功能是将python对象和JSON字符串的互相转换,json文件是一种key和value的格式,并提供数据的持久化保存,相比较于xml文件不需要更多的描述行,因此比xml文件体积更小,读取数据更直接。

json模块的常见方法:

1.json.__version__():显示版本

2.json.__all__:显示所有非内值方法:

3.json.__author__:作者,留的邮箱是Bob Ippolito <bob@redivi.com>

4.json._default_encoder:显示默认编码器:

 _default_encoder = JSONEncoder(
skipkeys=False,
ensure_ascii=True,
check_circular=True,
allow_nan=True,
indent=None,
separators=None,
encoding='utf-8',
default=None,
)

_default_encoder

5.json.dump:

6.json.dumps() #使用json对非json数据进行格式化后通过json格式,成为序列化

1 import  json
2 data = {"backend": "www.test.org","record":{"server": "192.168.0.200","weight": 10,"maxconn": 3}}
3 with open("test.json","a+") as f:
4 f.write(json.dumps(data)) #执行完成后会将data写入一个新的文件

json.dumps

7.json.load()

8.json.loads()  #对json保存的数据进行反序列化处理显示

三:lambda表达式:是一个匿名函数,一个处理逻辑简单的表达式:

 f = lambda x,y,z:x+y+z #lambda x,y,z为传入三个参数,以冒号分隔,执行x+y+z
print(f(3,4,5)) 执行结果:
12 def dic(x): #第一步执行函数,第三步x=2
return lambda y:x+y #第四步执行lambda表达式,需要传递x的值,第六步x等于2y等于4,返回6即执行完毕
a = dic(2) #第二步传递2给x
print(a(4)) #第五步打印a并传递4给y
执行结果:
6

lambda

四:内置函数map:遍历序列,对每一个元素进行批量处理,最终获取一个新的序列

 给每个元素都加100:
li = [11,22,33] #定义一个新列表
new_list = map(lambda a:a + 100,li) #对每个元素进行处理加100,传递li列表
print new_list
等于使用函数:
def add(x):
for i in x:
new = i + 100
print new
add(li)

map

五:内置函数filter:默认取内容为真的元素

 #对序列中的元素进行筛选,最终获取符合要求的序列,只过滤布尔值为真的元素,0,空字符和空格为假
#如取出某个序列的元素大于某个指定的条件:
li = [11,22,33,44,55]
li2 = (filter(lambda a:a > 40,li))
for i in li2:
print(i) 执行结果:
44
55

filter

六:内置函数:reduce

 对序列内的所有元素进行累积操作,直到得出最终的结果:
例如:计算一个列表的相加的结果
计算1+2+3+4+5+6的结果,
li = [1,2,3,4,5,6]
num = reduce(lambda arg1,arg2:arg1+arg2,li) #累积操作,使用lambda 传递两个参数相加,传递列表li
print num 执行结果:
21

reduce

七:生成器:yield

 生成器:yield
记住上一次操作,下次执行是时候继续执行
return 之后函数的生命周期就结束了,而且一个函数只能有一个return,如果有多个return则只执行第一个return,后面的就不再执行,yield可以有多个而且都会执行 通过yield循环小于10的数字
def mrange(arg):
seed = 0
while True:
if seed >= 10: #当条件大于等于10,就进行return,可以是break或continue
return
else: #假如条件不大于10,即0-9之间
seed = seed + 1 #加1并赋值给自身
yield seed #将值返回,这里不能是return,因为return表示函数的结束
for i in mrange(10):
print i

yield

内置函数总结:

reduce:对元素进行累加操作,比如每个数做同样的操作

filter:对序列进行过滤,最终获取符合自己要求的序列

map:遍历序列,对每一个元素进行操作,最终获取一个新的序列

yield:对序列中的元素进行累积操作,直到最后一个元素结束,从而得到最终的结果

八:函数参数:

形参:定义函数的时候后面定义的函数,没有实际值,如:def func(a,b):,则a和b是形参

实参:在调用函数执行的时候传递的实际参数,如func(1,2)是实参

1、默认参数:默认参数必须放在最后的位置:

按照顺序赋值,可以在设置参数的时候设置默认值,在调用的时候如果给参数传递了值会覆盖默认参数的值,如果没有传递值会是默认参数的值,如:

 def show(a,b=3,c=4): #默认参数必须放在最后,可以有多个
print(a,b,c) show(1)
#执行结果:
#1 3 4 #将没有传递参数的b和c使用了默认设置的3和4

默认参数

2、指定参数,在传递参数的时候根据传递参数的名称传递参数的值,指定参数不受位置的影响,如:

 def show(a,b,c):
print(a,b,c) show(10,c=3,b=2) #在调用的时候给指定参数传递值,不受位置限制 执行结果:
10 2 3

指定参数

3、动态参数:*args,可以传递多个参数和列表:

 def dic1(*args):  #形参,参数可以不固定数量和形式,接收调用的时候传递的多个实参
print(args)
dic1("name","age") #实参

动态参数

4、传递字典:

 def dic1(*args,a=1,**kwargs):
print(args,a,kwargs)
dic1("c","c",c=2,b=3) 执行结果:
('c', 'c') 1 {'b': 3, 'c': 2}

*args,**kwargs

 通过动态参数进行格式化输出:

 name = "{name} is {age},job is {job}"  #变量
dic = {"name":"jack","age":18,"job":"IT"} #定义字典,字典是name和age,和变量相同
result = name.format(**dic) #格式化字符串传递**dic字典并赋值给result
print(result) 执行结果:
jack is 18,job is IT

通过动态参数进行格式化输出

 通过函数发送邮件:

 1 import smtplib
2 from email.mime.text import MIMEText
3 from email.utils import formataddr
4
5 def mail(user):
6 ret = True
7 try:
8 msg = MIMEText('邮件内容', 'plain', 'utf-8')
9 msg['From'] = formataddr(["张士杰",'rooroot@126.com'])
10 msg['To'] = formataddr(["测试邮件",'1669121886@qq.com'])
11 msg['Subject'] = "主题"
12
13 server = smtplib.SMTP("smtp.126.com", 25)
14 server.login("rooroot@126.com", "login password")
15 server.sendmail('rooroot@126.com', [user,], msg.as_string())
16 server.quit()
17 return ret
18 except Exception:
19 ret = Flase
20
21 ret = mail("1669121886@qq.com")
22 if ret:
23 print("发送成功")
24 else:
25 print("发送失败")
26
27
28 执行结果:
29 发送成功

通过给函数传递参数发送邮件

Python 第三篇(上):python文件基础操作、json模块、lambda、map、filter、reduce和函数位置参数的更多相关文章

  1. Python面试题之Python中的lambda map filter reduce zip

    当年龟叔想把上面列出来的这些都干掉.在 “All Things Pythonic: The fate of reduce() in Python 3000”这篇文章中,他给出了自己要移除lambda. ...

  2. python第三篇:python、flask关系映射

    python中关系映射主要包括三种:一对多关系映射.一对一关系映射.多对多关系映射. 一对多关系映射 一方:Student(学生) 添加关联属性和反向引用 多方:Article(文章) 添加外键关联 ...

  3. python中的内置函数lambda map filter reduce

    p.p1 { margin: 0; font: 12px "Helvetica Neue" } p.p2 { margin: 0; font: 12px "Helveti ...

  4. 孤荷凌寒自学python第三十七天python的文件与内存变量之间的序列化与反序列化

    孤荷凌寒自学python第三十七天python的文件与内存变量之间的序列化与反序列化 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.什么是序列化与反序列化 序列化是指将内存中的数据进行指 ...

  5. 孤荷凌寒自学python第三十三天python的文件操作初识

     孤荷凌寒自学python第三十三天python的文件操作初识 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天开始自学python的普通 文件操作部分的内容. 一.python的文件打开 ...

  6. 第三篇、Python函数

    1.函数和过程的定义: 1) 函数定义:函数是逻辑结构化和过程化的一种编程方法. 2) 过程定义:过程就是简单特殊没有返回值的函数. 当一个函数/过程没有使用return显示的定义返回值时,pytho ...

  7. Python文件基础操作(IO入门1)

    转载请标明出处: http://www.cnblogs.com/why168888/p/6422270.html 本文出自:[Edwin博客园] Python文件基础操作(IO入门1) 1. pyth ...

  8. 孤荷凌寒自学python第三十九天python 的线程锁Lock

    孤荷凌寒自学python第三十九天python的线程锁Lock (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 当多个线程同时操作一个文件等需要同时操作某一对象的情况发生时,很有可能发生冲突, ...

  9. 孤荷凌寒自学python第三十八天初识python的线程控制

     孤荷凌寒自学python第三十八天初识python的线程控制 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.线程 在操作系统中存在着很多的可执行的应用程序,每个应用程序启动后,就可以看 ...

随机推荐

  1. Mahout源码MeanShiftCanopyDriver分析之二MeanShiftCanopyMapper仿造

    首先更正一点,昨天处理数据的时候是有问题的,直接从网页中拷贝的文件的空格是有问题的,直接拷贝然后新建的文件中的空格可能有一个两个.三个的,所以要把两个或者三个的都换为一个,在InputMapper中下 ...

  2. HDOJ 1495 非常可乐 【BFS】

    非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  3. G - 好老师

    G - 好老师 Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu Submit Statu ...

  4. Linux下Apache重启遇到No space left on device错误的解决方法

      解决办法:1.输入:ipcs -s 看有没有超过5个,如果有请执行下面2的命令:2.ipcs -s | perl -ane '/^0x00000000/ && `ipcrm -s ...

  5. 关于Python网络爬虫实战笔记③

    Python网络爬虫实战笔记③如何下载韩寒博客文章 Python网络爬虫实战笔记③如何下载韩寒博客文章 target:下载全部的文章 1. 博客列表页面规则 也就是, http://blog.sina ...

  6. 简单OC程序

       Foundation框架头文件的路径 1> 右击Xcode.app --> 显示包内容 2> Xcode.app/Contents/Developer/Platforms/iP ...

  7. android 布局常用混淆属性

    1.如何控制某一控件在父控件中的相对位置呢? 在Android系统中提供了layout_margin,用来控制某一控件边缘相对于父控件的边距. 其中, android:layout_marginTop ...

  8. Groovy在不同JDK版本下的性能差异

    Groovy作为一种动态语言,性能和JAVA比肯定是差不少,根据网友的测试,由于测试环境,场景和编译参数的不同,大概有差2到7倍的差距 那么同样的Groovy,在不同的JDK版本下,会有着怎样的差异呢 ...

  9. Making your first driver - complete walkthrough(使用VisualDDK)

    This article describes how to create, build and debug your first driver using Visual Studio and Visu ...

  10. C# WinForm判断Win7下是否是管理员身份运行

    原文:C# WinForm判断Win7下是否是管理员身份运行 如果程序不是以管理员身份运行,操作本地文件会提示:System.UnauthorizedAccessException异常 Vista 和 ...