一 文件操作

  • 打开文件,得到文件句柄并赋值给一个变量
  • 通过句柄对文件进行操作
  • 关闭文件

1.1打开文件读取内容

  1. print(open("sounds","r",encoding="utf-8").read())
  2. Somehow, it seems the love I knew was always the most destructive kind
  3.  
  4. Yesterday when I was young
  5.  
  6. The taste of life was sweet
  7.  
  8. As rain upon my tongue
  9.  
  10. I teased at life asif it were a foolish game

1.2文件内存对象

正常对于一个文件打开,在进行操作,是需要加载到内容中,并在内存对象里赋值一个变量,后续再找到这个变量,来操作文件,这个文件对象就是文件句柄,一般情况通常都是用f来指定
  1. f =(open("sounds","r",encoding="utf-8"))
  2. print(f.read())
  3.  
  4. Somehow, it seems the love I knew was always the most destructive kind
  5.  
  6. Yesterday when I was young
  7.  
  8. The taste of life was sweet
  9.  
  10. As rain upon my tongue
  11.  
  12. I teased at life asif it were a foolish game

1.3在文件里写入内容

使用下面的方式会对源文件覆盖,w会写入覆盖,而且是不可读的,具体后面有讲解
  1. f =(open("sounds","w",encoding="utf-8"))
  2. f.write("chuck is most handsome\n")#\n为回车换行符
  3.  
  4. f.write("楼上说的对")
  5.  
  6. f.close()

1.4在文件中追加

  1. f =(open("sounds","a",encoding="utf-8"))
  2. f.write("chuck is most handsome\n")#\n为回车换行符
  3.  
  4. f.write("楼上说的对")
  5.  
  6. f.close()
  7.  
  8. ##文件内容如下,可以看到追加了两行
  9.  
  10. Somehow, it seems the love I knew was always the most destructive kind
  11.  
  12. Yesterday when I was young
  13.  
  14. The taste of life was sweet
  15.  
  16. As rain upon my tongue
  17.  
  18. I teased at life asif it were a foolish game
  19.  
  20. chuck is most handsome
  21.  
  22. 楼上说的对

1.5使用readline只打印前五行内容

使用readline按行读取文件内容,使用for循环读出文件的前五行
  1. f =(open("sounds","r",encoding="utf-8"))
  2. for line in range(5):
  3.  
  4. print(f.readline().strip())
  5.  
  6. f.close()
  7.  
  8. Somehow, it seems the love I knew was always the most destructive kind
  9.  
  10. Yesterday when I was young
  11.  
  12. The taste of life was sweet
  13.  
  14. As rain upon my tongue
  15.  
  16. I teased at life asif it were a foolish game

1.6使用readlines不输出将第五行变为其他输出

readlines的输出其实是将每一行当做一个元素转换成一个列表,使用for循环将其输出其实就是在循环列表内容
  1. f =(open("sounds","r",encoding="utf-8"))
  2. count =1
  3.  
  4. for line in f.readlines():
  5.  
  6. if count ==5:
  7.  
  8. print("看到没,这是第%s行"% count)
  9.  
  10. print(line.strip())
  11.  
  12. count +=1
  13.  
  14. Somehow, it seems the love I knew was always the most destructive kind
  15.  
  16. Yesterday when I was young
  17.  
  18. The taste of life was sweet
  19.  
  20. As rain upon my tongue
  21.  
  22. 看到没,这是第5
  23.  
  24. I teased at life asif it were a foolish game

1.7直接循环f,逐行加载到内存中,读一行删掉一行

使用readlines的方法是逐行读取内容完一次性加载到内存中,如果文件过大,就会影响内存的使用率,加大了内存的使用空间,从磁盘读取到内存会浪费很多时间,readlines只适合读小文件,所以这时要引入其他方法来读取大文件,使用循环f方法,逐行加载到内存中,读一行删掉一行,使用此方法后内容不再是一个列表,是一个迭代器似的内容,建议以后使用此方法循环读取文件内容
  1. f =(open("sounds","r",encoding="utf-8"))
  2. count =1
  3.  
  4. for line in f:
  5.  
  6. if count ==5:
  7.  
  8. print("看到没,这是第%s行"% count)
  9.  
  10. print(line.strip())
  11.  
  12. count +=1
  13.  
  14. f.close()
  15.  
  16. Somehow, it seems the love I knew was always the most destructive kind
  17.  
  18. Yesterday when I was young
  19.  
  20. The taste of life was sweet
  21.  
  22. As rain upon my tongue
  23.  
  24. 看到没,这是第5
  25.  
  26. I teased at life asif it were a foolish game

1.8 移动读取写入文件的光标

  • 文件初始位置光标为0
  1. f =(open("sounds","r",encoding="utf-8"))
  2. print(f.tell())
  3.  
  4. 0
  • 读入一行后输出
  1. f =(open("sounds","r",encoding="utf-8"))
  2. f.readline()
  3.  
  4. print(f.tell())
  5.  
  6. 72
  • 使用read读取指定的字符数
  1. f =(open("sounds","r",encoding="utf-8"))
  2. f.readline()
  3.  
  4. print(f.read(20))
  5.  
  6. print(f.tell())
  7.  
  8. Yesterday when I was
  9.  
  10. 92
  • 使用seek回到默认位置,seek和tell往往搭配起来使用
  1. f =(open("sounds","r",encoding="utf-8"))
  2. f.readline()
  3.  
  4. print(f.read(20))
  5.  
  6. f.seek(0)
  7.  
  8. print(f.tell())
  9.  
  10. Yesterday when I was
  11.  
  12. 0

1.8 其他一些操作文件的方法

  • 使用encoding打印文件的编码
  1. f =(open("sounds","r",encoding="utf-8"))
  2. print(f.encoding)
  3.  
  4. utf-8
  • errors用来做异常处理的
  • fileno返回操作系统的接口的id,无需关注
  • name打印文件名字
  • tty判断是否为一个终端设备
  • seekable判断是否可以移动光标
  • readable判断文件是否可读,防止报错
  • writeable判断文件是否可写,防止报错
  • buffer内存里的一个临时文件
  • flush将内存的内容刷到磁盘中
有些情况写文件,会首先写到buffer中,然后达到一定大小刷新到磁盘,这是缓冲的一个优势,如果对数据要求实时的一致性,要求对数据很严格,这时使用flush可以实现写每行内容立马刷进磁盘中,还可以使用flush打印进度条
  1. import sys,time
  2. for i in range(30):
  3.  
  4. sys.stdout.write(">>")
  5.  
  6. sys.stdout.flush()
  7.  
  8. time.sleep(0.1)
  • truncate截断文件内的光标,无论是光标在哪,都会从开头计算截断位置
  1. f =(open("sounds","a",encoding="utf-8"))
  2. f.truncate(55)

1.9 对文件的权限读写权限介绍

** 打开文件的模式有:**
  • r,只读模式(默认)。
  • w,只写模式。【不可读;不存在则创建;存在则删除内容;】
  • a,追加模式。【可读;不存在则创建;存在则只追加内容;】
“+” 表示可以同时读写某个文件
  • r+,可读写文件。【可读;可写;可追加】实际是从最后追加内容,比较常用
  • w+,写读,和r+区别是先创建一个新文件后写入,python3.0不能使用seek移动光标后写入,一定都是从最后一行写入,实际上写读模式没什么卵用
  • a+,同a
“U”表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
  • rU
  • r+U
“b”表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注,python3.0中socket传输只能使用二进制内容,二进制内容最好都是用二进制方式打开,否则可能会损坏文件)
  • rb
  • wb
  • ab

1.10 修改文件里的指定内容

上面说了对文件的写读等操作,如果想要修改文件的指定内容,就需要将文件加载到内存中,在内存里修改,修改后在写回源文件,就不需要创建新文件了,但是文件太大就不合适了,内存会跑满;另一种方式是打开一个文件修改,最后写入到一个新文件里,这种方式可以应对大文件的更改,下面就是用第二种方式实现更改
原文件内容如下:
  1. Somehow, it seems the love I knew was always the most destructive kind
  2. Yesterday when I was young
  3.  
  4. The taste of life was sweet
  5.  
  6. As rain upon my tongue
  7.  
  8. I teased at life asif it were a foolish game
  9.  
  10. The way the evening breeze

将第5行的tongue改为eyes

  1. f = open("sounds","r",encoding="utf-8")
  2. f2 = open("sounds2","w",encoding="utf-8")
  3.  
  4. for line in f:
  5.  
  6. if"tongue"in line:
  7.  
  8. line = line.replace("tongue","eyes")
  9.  
  10. f2.write(line)
  11.  
  12. f.close()
  13.  
  14. f2.close()

新文件如下

  1. Somehow, it seems the love I knew was always the most destructive kind
  2. Yesterday when I was young
  3.  
  4. The taste of life was sweet
  5.  
  6. As rain upon my eyes
  7.  
  8. I teased at life asif it were a foolish game
  9.  
  10. The way the evening breeze

1.11 学习操作文件的with方法

使用直接使用open打开文件是需要关闭的,最好是手动close,但是程序执行完依旧是会关闭文件,如果不进行手动关闭,打开文件过多的时候,只要程序不退出,打开的文件句柄始终不退出,直到程序结束时才会关闭,造成了内存空间关闭,所以要实时关闭,引入with方法,with支持同时打开多个文件,建议多使用with语法
with语句
为了避免打开文件后忘记关闭,可以通过管理上下文,即:
  1. with open('log','r')as f:
  2. ...

如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。

在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:
  1. with open('log1')as obj1, open('log2')as obj2:pass

使用范例:

  1. with open("sounds","r",encoding="utf-8")as f:
  2. for line in f:
  3.  
  4. print(line.strip())
  5.  
  6. Somehow, it seems the love I knew was always the most destructive kind
  7.  
  8. Yesterday when I was young
  9.  
  10. The taste of life was sweet
  11.  
  12. As rain upon my tongue
  13.  
  14. I teased at life asif it were a foolish game
  15.  
  16. The way the evening breeze

二 函数

2.1 函数定义

函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,具体区别,我们后面会讲,编程中的函数在英文中也有很多不同的叫法。在BASIC中叫做subroutine(子过程或子程序),在Pascal中叫做procedure(过程)和function,在C中只有function,在Java里面叫做method。

定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可

特性:

  1. 减少重复代码
  2. 使程序变的可扩展
  3. 使程序变得易维护

语法定义

  1. def sayhi():#函数名
  2.  
  3. print("Hello, I'm nobody!")
  4.  
  5. sayhi() #调用函数

可以带参数

  1. #下面这段代码
  2. a,b = 5,8
  3.  
  4. c = a**b
  5.  
  6. print(c)

#改成用函数写

  1. def calc(x,y):
  2. res = x**y
  3.  
  4. return res #返回函数执行结果
  5.  
  6. c = calc(a,b) #结果赋值给c变量
  7.  
  8. print(c)

2.2 函数参数与局部变量

形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量

实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。

2.2.1 默认参数

  1. def stu_register(name,age,country,course):
  2. print("----注册学生信息------")
  3.  
  4. print("姓名:",name)
  5.  
  6. print("age:",age)
  7.  
  8. print("国籍:",country)
  9.  
  10. print("课程:",course)
  11.  
  12. stu_register("王山炮",22,"CN","python_devops")
  13.  
  14. stu_register("张叫春",21,"CN","linux")
  15.  
  16. stu_register("刘老根",25,"CN","linux")

发现 country 这个参数 基本都 是"CN", 就像我们在网站上注册用户,像国籍这种信息,你不填写,默认就会是 中国, 这就是通过默认参数实现的,把country变成默认参数非常简单

  1. def stu_register(name,age,course,country="CN"):

这样,这个参数在调用时不指定,那默认就是CN,指定了的话,就用你指定的值。

另外,你可能注意到了,在把country变成默认参数后,我同时把它的位置移到了最后面,默认参数必须在位置参数后面。

2.2.2 关键参数

正常情况下,给函数传参数要按顺序,不想按顺序就可以用关键参数,只需指定参数名即可,但记住一个要求就是,关键参数必须放在位置参数之后。

  1. stu_register(age=22,name='alex',course="python",)

2.2.3 非固定参数

若你的函数在定义时不确定用户想传入多少个参数,就可以使用非固定参数====传元组

  1. def stu_register(name,age,*args): # *args 会把多传入的参数变成一个元组形式
  2. print(name,age,args)
  3.  
  4. stu_register("Alex",22)
  5.  
  6. #输出
  7.  
  8. #Alex 22 () #后面这个()就是args,只是因为没传值,所以为空
  9.  
  10. stu_register("Jack",32,"CN","Python")
  11.  
  12. #输出
  13.  
  14. # Jack 32 ('CN', 'Python')

还可以有一个**kwargs======传字典

  1. def stu_register(name,age,*args,**kwargs): # *kwargs 会把多传入的参数变成一个dict形式
  2. print(name,age,args,kwargs)
  3.  
  4. stu_register("Alex",22)
  5.  
  6. #输出
  7.  
  8. #Alex 22 () {}#后面这个{}就是kwargs,只是因为没传值,所以为空
  9.  
  10. stu_register("Jack",32,"CN","Python",sex="Male",province="ShanDong")
  11.  
  12. #输出
  13.  
  14. # Jack 32 ('CN', 'Python') {'province': 'ShanDong', 'sex': 'Male'}

2.2.4 局部变量

  1. name = "Alex Li"
  2. def change_name(name):
  3.  
  4. print("before change:",name)
  5.  
  6. name = "金角大王,一个有Tesla的男人"
  7.  
  8. print("after change", name)
  9.  
  10. change_name(name)
  11.  
  12. print("在外面看看name改了么?",name)

#输出:

  1. before change: Alex Li
  2. after change 金角大王,一个有Tesla的男人
  3.  
  4. 在外面看看name改了么? Alex Li

2.2.5 全局变量和局部变量

在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
当全局变量与局部变量同名时:
在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。

2.3 函数的返回值

要想获取函数的执行结果,就可以用return语句把结果返回

注意:

  1. 函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结束
  2. 如果未在函数中指定return,那这个函数的返回值为None

2.4 嵌套函数

  1. name = "Alex"
  2.  
  3. def change_name():
  4. name = "Alex2"
  5.  
  6. def change_name2():
  7.  
  8. name = "Alex3"
  9.  
  10. print("第3层打印",name)
  11.  
  12. change_name2() #调用内层函数
  13.  
  14. print("第2层打印",name)
  15.  
  16. change_name()
  17.  
  18. print("最外层打印",name)

2.5 函数式编程

函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。

函数式编程中的函数这个术语不是指计算机中的函数(实际上是Subroutine),而是指数学中的函数,即自变量的映射。也就是说一个函数的值仅决定于函数参数的值,不依赖其他状态。比如sqrt(x)函数计算x的平方根,只要x不变,不论什么时候调用,调用几次,值都是不变的。

Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。

一、定义

简单说,"函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论。

主要思想是把运算过程尽量写成一系列嵌套的函数调用。举例来说,现在有这样一个数学表达式:

 (1 + 2) * 3 - 4

传统的过程式编程,可能这样写:

  var a = 1 + 2;

var b = a * 3;

var c = b - 4;

函数式编程要求使用函数,我们可以把运算过程定义为不同的函数,然后写成下面这样:

  var result = subtract(multiply(add(1,2), 3), 4);

这段代码再演进以下,可以变成这样

add(1,2).multiply(3).subtract(4)

这基本就是自然语言的表达了。再看下面的代码,大家应该一眼就能明白它的意思吧:

merge([1,2],[3,4]).sort().search("2")

因此,函数式编程的代码更容易理解。

2.6 高阶函数

变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

  1. def add(x,y,f):
  2. return f(x) + f(y)
  3.  
  4. res = add(3,-6,abs)
  5.  
  6. print(res)

Day3 文件操作和函数的更多相关文章

  1. php中文件操作常用函数有哪些

    php中文件操作常用函数有哪些 一.总结 一句话总结:读写文件函数 判断文件或者目录是否存在函数 创建目录函数 file_exists() mkdir() file_get_content() fil ...

  2. python 文件操作: 文件操作的函数, 模式及常用操作.

    1.文件操作的函数: open("文件名(路径)", mode = '模式', encoding = "字符集") 2.模式: r , w , a , r+ , ...

  3. python 文件操作的函数

    1. 文件操作的函数 open(文件名(路径), mode="?", encoding="字符集") 2. 模式: r, w, a, r+, w+, a+, r ...

  4. PHP文件操作功能函数大全

    PHP文件操作功能函数大全 <?php /* 转换字节大小 */ function transByte($size){ $arr=array("B","KB&quo ...

  5. Python之旅Day3 文件操作 函数(递归|匿名|嵌套|高阶)函数式编程 内置方法

    知识回顾 常见五大数据类型分类小结:数字.字符串.列表.元组.字典 按存值个数区分:容器类型(列表.字典.元组) 标量原子(数字.字符串) 按是否可变区分:可变(列表.字典) 不可变(数字.字符串.元 ...

  6. Day3 Python基础学习——文件操作、函数

    一.文件操作 1.对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过文件句柄对文件进行操作 关闭文件 #打开文件,读写文件,关闭文件 http://www.cnblogs.com/linha ...

  7. day3 -- 集合、文件操作、函数

    1.集合:集合无序,不重复,可以用set(列表) 方法将列表转换为集合,实现去重 对比列表:集合是{}包围,列表是[]包围 对比字典:集合是没有key的,字典是有key的 set_1 = {1, 2, ...

  8. PHP的文件操作常用函数

    PHP文件操作 1 获得文件名:basename - 返回路径中的文件名部分 给出一个包含有指向一个文件的全路径的字符串,本函数返回基本的文件名.如果文件名是以 suffix 结束的,那这一部分也会被 ...

  9. ioctl、文件操作接口函数以及nand的升级模式的操作过程详解

    概述 内核中驱动文件的操作通常是通过write和read函数进行的,但是很多时候再用户空间进行的操作或许不是内核中公共代码部分提供的功能,此时就需要使用一种个性化的方法进行操作--ioctl系统调用. ...

随机推荐

  1. AOP 面向切面的编程

    一.面向切面的编程需求的产生 代码混乱:越来越多的非业务需求(日志和验证等)加入后,原有的业务方法急剧膨胀.每个方法在处理核心逻辑的同时还必须兼顾其他多个关注点. 代码分散: 以日志需求为例,只是为了 ...

  2. python+selenium自动化软件测试(第12章):Python读写XML文档

    XML 即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进 行定义的源语言.xml 有如下特征: 首先,它是有标签对组成:<aa></aa> ...

  3. Spring整合Redis(spring-data-redis)

    历经几天看了大量的博客资料,差不多算是搞定了,目前只是针对单个数据源,集群暂时没研究 maven依赖 <properties> <!-- redis 版本 --> <re ...

  4. Spring Web MVC(三)之注解

    [toc] spring web mvc 基于注解的优化 我写的注解是按照spring web的部件分类写的,这样的话比较方便查看,大家感觉有用的话可以分享个别人,希望对对更多的人有帮助.毕竟零基础开 ...

  5. [2014-08-18]初尝 AspNet vNext On Mac

    网上关于AspNet vNext的介绍已经非常多,本文不再赘述,仅记录下Mac环境的几点注意事项. 环境 OSX 10.9.4 Mono 3.6.1 Kvm 1.0.0-alpha4-10285 mo ...

  6. 如何编写更好的SQL查询:终极指南-第二部分

    上一篇文章中,我们学习了 SQL 查询是如何执行的以及在编写 SQL 查询语句时需要注意的地方. 下面,我进一步学习查询方法以及查询优化. 基于集合和程序的方法进行查询 反向模型中隐含的事实是,建立查 ...

  7. jmeter 实现登录一次,多次操作登录后的某一个功能

  8. 零基础如何一步一步开始搭建高性能直播平台?现以GitChat·架构来进行说明

    前言 现在直播已经成为移动互联网时代一个新的重要流量入口,从YY.斗鱼到花椒直播,直播已经成为人们分享交流的新方式,应用场景众多,主要分为: 金融类直播:金融直播可应用于实时解盘,在线专家讲座,专家在 ...

  9. Redis订阅和发布模式和Redis事务

    -------------------Redis订阅和发布模式------------------- 1.概念     Redis 发布订阅(pub/sub)是一种消息通信模式:     发送者(pu ...

  10. 多线程编程学习四(Lock 的使用).

    一.前言 本文要介绍使用Java5中 Lock 对象,同样也能实现同步的效果,而且在使用上更加方便.灵活,主要包括 ReentrantLock 类的使用和ReentrantReadWriteLock ...