python学习笔记(7)文件的访问与函数式编程
一、文件读写的3中方法
1.直接读入
fiel1=open('test.txt')
file2=open('output.txt')
while True:
line=file1.readLine()
#这里可以进行逻辑处理
file2.write('"'+line[:]+'"'+",")
if not line:
break
#记住在文件处理完成的时候,关闭文件
file1.close()
file2.close()
读取文件的3种方法:
read()将文本文件的所有行读取到一个字符串中去。
readline()是一行一行的读取
readlines()是将文本文件的所有行读取到一个list中去,文本文件的每一行都是一个list的一个元素。优点:readline()可以在读取的过程中跳过特定的行
2.文件的第二种读取方法,文件迭代器,用for循环的方法
file2=open("output.txt","w")#先将要读取的文件打开
for line in open("test.txt"):#文件迭代器
#这里可以进行逻辑处理
file2.write('"'+line[:]+'"'+",')
3.文件上下文管理器
#打开文件
#用with...open自带关闭文本的功能
with open('somefile.txt','r') as f:#用with把我要做的事都包括进来
data=f.read()
#loop整个文档
with open('somefile.txt','r') as f:
for line in f:
#处理没一行的数据
#写入文本
with open('somefile.txt','w') as f:
f.write(text1)
f.write(text2)
...... #把要打印的line写入文件中
with open('somefile.txt','w') as f:
print(line1,file=f)#将值写进file中去
print(line2,file=f)
二、二进制问价的读写
1.python默认读取的都是文本文件。要是想读取二进制文件就需要把刚刚的'r'改成'rb'
f=open('EDG.jpg','rb')
print(f.read())
#简单的说,任何非标准的文本文件。对于py3来说,标准是unicode,需要用二进制读入这个文件,然后再用
#.decode('.....')方法来解码这个二进制文件
I=open('DegangGuo.txt','rb')
#解码
u.f.read().decode('DeyunCode')
2.文件和目录操作
(1)用python内置的os模块直接调用操作系统提供的接口函数
import os
os.name
这里通过OS告诉我们操作系统的名字。如果是posix,说明是nix族,如果是nt,就是windows
(2)环境变量:操作系统中定义的环境变量,全部保存在os.environ这个dict中,可以直接进行相关的查看
os.envirn
(3)查看删除创建目录;
#当前目录的绝对路径
os.path.abspath('.') #在某个目录下面创建一个新的目录,首先把目录的完整路径表示出来
os.path.join('/Users/EDC','Pictures')
#在这里得到的是一个字符串,代表了新的文件夹的位置:/Users/EDC/Pictures/ #需要用到mkdir来创建文件夹
os.nkdir('/Users/EDC/Pictures/') #同理删除一个文件夹
os.rmdir('Users/EDC/Pictures/') #同样的道理,在拆分路径的时候,也不要直接去拆分字符串,而是要通过os.path.split()函数,这样可以将一个路径拆分为两部分,后一个部分总是最后级别的目录或者文件名:
os.path.split('Users/EDC/Pictures/AJiao.avi')
#('/Users/EDC/Pictures/','AJiao.avi') #或者通过os.path.splitext()得到文件得扩展名
os.path.splitext('/Users/EDC/Pictures/','AJiao.avi')
#('/Users/EDC/Pictures/AJiao','avi') #文件重命名
os.rename('JAV-001.avi','学习资料')
#删除文件
os.remove('学习资料')
三、第三方库的调用
1.Shutil库的调用
import shutil
shutil.copyfile('path/to/file','/path/to/other/file')#实现文件的复制
2.列出当前目录下的所有目录
[x for x in os.listdir('.') if os.apth.isdir(x)]#如果x是一个文件夹的话,就进行这样的操作
#你会得到一个list文件夹
#如果只想列出所有的py文件
[x for x in os.listdir('.') if os.path.isfile(x) and os.path(x)[1]=='.py']#如果x是一个文件并且x是以.py来结尾的
3.序列化和反序列化
什么是序列化?
程序运行过程中,所有变量都是在内存中进行操作的,当程序一旦运行完成,结束退出之后,变量占用的内存就被操作系统回收了。因此我们需要讲数据持久化到磁盘中去,下次运行的时候,从磁盘中读取相关的数据。
我们将变量从内存中变成可以存储或者可以传输的过程称之为序列化,在python中称之为pickling,在其他语言汇总也称之为serialization、marshalling、flattening等等,说的就是一个意思。反之就称之为反序列化,称之为unpickling,把变量从序列化的对象读取到内存中的过程
序列化
import pickle #此处定义了一个dict字典对象
d=dict(name='思聪',age=,score=)
str=pickle.dumps(s)#调用pickle的dumps函数进行序列化的处理,之后返回的是一个string对象
print(str)#可以看看str长得什么样 #定义和创建一个file对象,设定模式为wb,在serialize之后是以二进制的数据来进行相关存储的
f=open('dump.txt','wb')
#将内容序列化到file文件中
pickle.dump(d,f)#将内存中的对象d存放到f文件中的
f.close()#最后关闭文件资源
反序列化
就是将刚噶完成的'序列化的码'转换为python看得懂的object对象
import pickle
#从之前dump.txt文件中读取内容
f=open('dump.txt','rb')#设定文件选项模式为rb
d=pickle.load(f) #调用load做反序列化的过程
f.close()#关闭文件资源
print(d)
print('name is %s'%d['name'])
4.用JSON实现序列化和反序列化
JSON类型 python类型
{} dict
[] list
"string" 'str'或者u'unicode'
1234.56 int或者float
true/false True/False
null Null
如果想有一个比较结构化的数据想要进行序列化,并且想要别的语言也能够读懂,那么可以用JSON来做
import json
#定义dict字典对象
d1=dict(name='小王',age=,score=)
str=json.dumps(d1)#调用json的dumps函数进行json序列化处理
print(str) #调用json的loads函数进行反序列化处理
d2=json.loads(str)
5.高阶函数:可以将别的函数作为参数传入的函数称之为高阶函数
举个例子:求绝对值的函数式abs()
abs(-)
如果只是写abs我们得到的是一个叫做abs的函数
abs #直接输出<function abs>,在python中,变量和函数都是一个object,也就是说abs这个函数可以直接复制给另外一个变量 f=abs
f(-9)
9
(1)高阶函数
def add(x,y,f):
return f(x)+f(y) 当我么调用add(-,,abs)的时候,参数x和y分别接收-,6和abs: add(-,,abs)
6.匿名函数
(1)Lamda函数的语法只包含一个语句,如下:
lambda [arg1[,arg2,......argn]]:expressoin
相加的函数
sum=sambda arg1,arg2:arg1+arg2
sum(,)
30 实际上就是一个函数;
def sum(arg1,arg2):
return arg1+arg2
除了Lambda函数之外,Python还提供了其他的几个辅助工具,让你的函数代码更加的牛逼
(2)reduce函数
python中的reduce函数式一个二元操作函数,他用来讲一个数据集合(列表,元组)中的所有数据进行如下的操作,传给reduce中的函数func()必须是一个二元操作函数,先对集合中第一二个元素进行操作,得到的结果在与第三个数据用func()函数来运算最后得到的一个结果
顾名思义,reduce函数就是把list给缩成一个值,所以必须用二元的操作函数
from functools import reduce
l=[,,,,]
print(reduce(lambda x,y:x+y,l))#这里代表着把list中的值一个个放进lambda的x,y中 #这个地方,如果给出了一个初始值,可以放在lsit后面
print(reduce(lambda x,y:x+y,l,))
#这样x开始的时候就别赋值为10,然后依次
(3)map函数:map函数用于每一个可以迭代的项,返回的结果是list。如果有其他可以迭代的参数传递进来,map函数会把每一个参数都以相应的处理函数进行迭代处理。map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到每个元素,并把结果返回给新的list
格式:map(func,seqq[,....seq2])
python函数式的编程中map()函数都是讲func作用于seq中的每一个元素,并用一个列表给出一个返回值。
map可以使用任何lambda函数来进行操作,本质是把原来的list根据lambda法则变成另外一个list
l=[,,]
new_list=list(map(lambda i:i+,l))
print(new_list) #py3中,外面要套一个list #我们也可以把两个数组搞成单独的数组
l2=[,,]
new_list=list(map(lambda x,y,l,l2))
print(new_list)
(4)filter函数
filter()可以对序列做过滤处理,可以用一个自定义的函数来过滤一个序列,把序列的每一项传递到自定义的过滤函数里进行相关的处理,并返回结果做过滤。最终一次性返回过滤后的结果。和map()函数相类似。filter也可以接收一个函数和序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回的是True或者False决定是保留元素还是丢弃
语法:filter(func,seq)
l=[,,,,]
new=list(filter(lambda x:x<,l))#py3将整个得到的list转换为list函数,便于打印出来
print(new)
7.装饰器:装饰器就是函数的[包装]
def hello(fn):
def wrapper():
print("hello,%s"% fn.__name__)
fn()
print("goodby,%s"% fn.__name__)
return wrapper @hello
def foo():
print("i am foo") foo() 返回结果:hello,foo
i am foo
goodby,foo
你可以看到:
(1)函数foo前面有个@hello的注解,hello就是我们前面定义的函数hello
(2)在hello函数中,需要一个fn函数的参数(这就用来回调的函数)
(3)hello函数汇总返回了一个inner函数wrapper,这个wrapper函数回调了传进来的fn,并在回调前后加了两条语句
(4)从本质上讲,用@decorator来修饰某个函数的时候,其实是做了两件事
@decorator
def func():
pass
变成===>func=decorator(func)再简单一点,就是把一个函数传递到林割爱一个函数,然后再调给自己
(5)hello(foo)返回了wrapper()函数,所以foo其实变成了wrapper的一个变量,二后面的foo()执行其实变成了wrapper() (6)同理我们可以搞多个decorator:
@decorator_one
@decorator_two
def func():
pass
相当于:func=decorator_one(decorator_two(func))
def makeHtmlTag(tag,*args,**kwds):
def real_decorator(fn):
css_class=" class='{0}'".format(kwds["css_class"]) \
if "css_class" in kwds else ""
def wrapped(*args,**kwds):
return "<"+tag+css_class+">"+fn(*args,**kwds)+"</"+tag+">"
return wrapped
return real_decorator
@makeHtmlTag(tag ="b",css_class="bold_css")
@makeHtmlTag(tag="i",css_class="italic_css") def hello():
return "hello world"
print(hello())
class myDecorator(object):
def __init__(self,fn):
print("inside myDecorator.__init__()")
self.fn=fn
def __call__(self):
self.fn()
print("inside myDecorator.__call__()")
@myDecorator
def aFunction():
print("inside aFunction()")
print("Finished decorating aFunction()") aFunction()
python学习笔记(7)文件的访问与函数式编程的更多相关文章
- python学习笔记(11):文件的访问与函数式编程
一.文本文件读写的三种方法 1.直接读入 file1 = open('E:/hello/hello.txt') file2 = open('output.txt','w') #w是可写的文件 whil ...
- Python学习笔记之文件处理
1.打开和关闭 要打开文件可以使用函数 open(),它位于自动导入模块 io 中.函数将文件名作为唯一不可缺少的函数,并返回一个文件对象.它还有一个名叫 mode 的参数,用于指定文件模式,其可取值 ...
- [Python学习笔记]组织文件
shutil 模块 shutil 模块可以让我们很方便的在Python程序中复制.移动.改名和删除文件. 复制文件和文件夹 使用shutil.copy()来复制文件,该函数含两个参数,均为字符串格式的 ...
- Python学习笔记015——文件file的常规操作之一(文本文件)
1 什么是文件 文件是用于数据存储的单位 文件通常用来长期保存数据 读写文件是最常见的I/O操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件的功能都是由操作系统提供的,一般而言,操 ...
- 转载-python学习笔记之文件I/O
Python 文件I/O 本章只讲述所有基本的的I/O函数,更多函数请参考Python标准文档. 打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个用逗号隔开的表达式.此函数把你 ...
- Python学习笔记六--文件和输入输出
6.1文件对象 所有Python对文件的操作都是基于对文件对象的操作.那么就从文件对象的创建说起.open()[file()]提供初始化输入输出的接口.open()成功打开文件时会返回一个文件对象. ...
- python学习笔记之——文件I/O
1.print打印到屏幕 print "打印到屏幕" 2.读取读取键盘输入 (1)raw_input函数 raw_input([prompt]) 函数从标准输入读取一个行,并返回一 ...
- python学习笔记(六)---文件操作与异常处理机制
文件读取 读取整个文件 要读取文件,需要一个包含几行文本的文件.下面首先来创建一个文件,它包含精确到小数点后30位的圆周率值,且在小数点后每10位处都换行: pi_digits.txt 3.14159 ...
- 转载-Python学习笔记之文件读写
Python 文件读写 Python内置了读写文件的函数,用法和C是兼容的.本节介绍内容大致有:文件的打开/关闭.文件对象.文件的读写等. 本章节仅示例介绍 TXT 类型文档的读写,也就是最基础的文件 ...
随机推荐
- (26)Python获取某个文件存放的相对路径(更改任意目录下保持不变)
import os import platform def getSeparator(): ''' 获取不同平台下的斜杠符号 :return: Created by Wu Yongcong 2017- ...
- CG-CTF | 上传绕过
最近一直在做算法题,头都要大了,今天悄咪咪来一个web换换脑子,一发flag敲开♥[虽然知道这是个水题ε=ε=ε=┏(゜ロ゜;)┛]
- Swift权限控制
最后更新:2017-03-20 private: 只能在当前类里面访问 fileprivate: 只能在当前文件内访问 internal:internal访问级别所修饰的属性或方法在源代码所在的整个模 ...
- [BZOJ2822]:[AHOI2012]树屋阶梯(卡特兰数)
题目传送门 题目描述 暑假期间,小龙报名了一个模拟野外生存作战训练班来锻炼体魄,训练的第一个晚上,教官就给他们出了个难题.由于地上露营湿气重,必须选择在高处的树屋露营.小龙分配的树屋建立在一颗高度为N ...
- Microsoft Visual Studio 2013 Language Pack
Microsoft Visual Studio 2013 Language Pack Microsoft Visual Studio 2013 各版本语言包下载地址: https://my.visua ...
- Git remotes/origin/pr/* 分支清理,代码回退等
代码在gitHub上托管,每次git pull完后,用git branch -a都可以看到一堆remotes/origin/pr/*分支: 可以通过两种方式去除: 1,修改git的config文件找到 ...
- Java实体类之间的映射(多对多关系)
多对对的映射,可以用学生和课程进行演示.一个学生可以选择多个课程,一个课程又对应了多个学生 定义学生类 class Stu{ private String name; private String n ...
- vue+ts修改父组件属性的写法。
部分代码如下: 父组件: <coupon :modifyFlag.sync="flag" /> data() { return { fl ...
- 《HTML5 高级程序设计》
第一章 HTML5 概述 开发 HTML5 的组织 Web Hypertext Application Technology Working Group (WHATWG):开发 HTML 和 Web ...
- 008-Spring Boot @EnableAutoConfiguration深入分析、内部如何使用EnableAutoConfiguration
一.EnableAutoConfiguration 1.EnableAutoConfiguration原理 springboot程序入口使用注解@SpringBootApplication,Sprin ...