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 类型文档的读写,也就是最基础的文件 ...
随机推荐
- LeetCode--006--Z 字形变换(python)
将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: 之后,你的输出需要从左 ...
- 自动配置/切换/查看JDK环境变量
最近老是需要几个版本的JDK切换工作,于是网上收集资料整理,自己写了一个:自动配置/切换/查看JDK环境变量的批处理脚本.顺带3个JDK版本分别是:jdk1.6.0_43,jdk1.7.0_80,jd ...
- docker安装禅道
一.下载地址 禅道开源版: http://dl.cnezsoft.com/zentao/docker/docker_zentao.zip 数据库用户名: root,默认密码: 123456.运行时 ...
- 电脑新安装JDK版本并运行使用该JDK版本问题
情景:电脑上已正常安装一个jdk版本,如:1.7.0_71,因考虑到一些情况,现需要使用版本为1.7.0_80(1.8),故需新安装JDK,并使服务可以运行使用新安装的JDK版本. 网络找寻方法: ( ...
- 阿里云CentOS 7.3安装Redis详细步骤
############ 准备 ############### 从Redis官网下载Linux redis3.2.6版本,我下载的redis-3.2.6.tar.gz(目前最新稳定版),下载到/u ...
- POJ 1380 Equipment Box (暴力枚举)
Equipment Box 题目链接: http://acm.hust.edu.cn/vjudge/contest/130510#problem/B Description There is a la ...
- 11年Macbook Air 安装win10 经验
11年macbook air安装win10折腾了好久,安装成功经验记录下. 1.使用BootCamp v6.0.6133 2.启动时U盘里面有两个引导Window和EFI,选择Windows启动.EF ...
- 取得所有网卡的MAC地址,包括禁用的
先在nuget包中添加System.Management.Automation引用. 然后下面就是代码了. using System;using System.Collections.ObjectMo ...
- js 父子标签同时设置onclick,子标签触发父标签onclick解决办法
js 父子标签同时设置onclick,子标签触发父标签onclick 或 子标签为a 先触发onclick 再触发 a 的 href: 解决方案:在子标签的onclick里写 var ev = win ...
- 清北学堂2019NOIP提高储备营DAY4
今天只有一上午,讲的东西不多,这里就整理一下高精的东西,数论部分请见my blog 高精度: 先讲一讲进制问题:十进制的二进制表示:以10为例, 10的二进制表示为1010 10的三进制表示为101 ...