python基础3之文件操作、字符编码解码、函数介绍
内容概要:
一、文件操作
二、字符编码解码
三、函数介绍
一、文件操作 |
文件操作流程:
- 打开文件,得到文件句柄并赋值给一个变量
- 通过句柄对文件进行操作
- 关闭文件
基本操作:
- #/usr/bin/env python
- # -*- coding:utf-8 -*-
- #Author:W-D
- f=open("test","r",encoding="utf-8")#打开文件,并告诉解释器以那种编码打开,编码不对会报错
- data=f.read()#操作文件
- print(data)#打印文件内容
- f.close()#关闭文件
打开文件模式:
r ,只读模式【默认】
w,只写模式【不可读:不存在则创建;存在则清空内容;】
x, 只写模式【不可读:不存在则创建,存在则报错】
a, 追加模式【不可读;不存在则创建;存在则只追加内容;】
“+”表示同时读写某个文件,特别注意在操作文件过程中明白文件指针的位置,稍后我会举例子说明文件针的问题。
- r+,可读写文件【可读;可写;可追加】
- w+,写读
- a+,追加读
"b"表示处理二进制文件,意思是"b"类型打开的文件读的内容是字节类型(bytes),若写入文件也需要是字节类型,需要通过bytes进行转化。(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
- rb
- wb
- ab
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用),在python3中该模式已经废弃了,2.x版本中保留。
- rU
- r+U
示列一(r+模式):
下面着重说明文件指针和读写文件的关系,同时演示下以“b”模式打开的文件读写操作。
文件内容:
- You were the shadow to my light
- Did you feel us
- Another Star
- You fade away
- Afraid our aim is out of sight
- Wanna see us
- Alive
- Where are you now
- Where are you now
- Where are you now
示列代码:
- #f.tell() 读取当前文件指针位置,单位为字符
- #f.seek() 重新偏移指针位置,参数为整数
- #f.readline()表示读取一行
- #/usr/bin/env python
- # -*- coding:utf-8 -*-
- #Author:W-D
- f=open("test","r+",encoding="utf-8")
- print(f.tell())#打印开始的指针位置
- data=f.readline()#读取第一行数据放在data里
- print(len(data),data)#打印数据长度内容
- print(f.tell())#打印当前指针位置
- f.write("我")#写文件内容
- print(f.tell())#打印指针位置
- f.close()#关闭文件
- 结果:
- 0
- 28 were the shadow to my light
- 29
- 186
- 修改后的文件变为:
- were the shadow to my light
- Did you feel us
- Another Star
- You fade away
- Afraid our aim is out of sight
- Wanna see us
- Alive
- Where are you now
- Where are you now
- Where are you now我
结果分析:上述结果表明,以r+模式打开文件,一开始文件指针在0,但读取一部分内容后文件指针后移动,当使用write方法写文件时候,文件指针移到了末尾变成最后追加的方式,而并不是在读取文件时候的指针位置直接写。
示列二(以r+b):细心的小伙伴可以发现同样有r+模式,都是读取后再写内容,但是以“r+”模式指针移到了最后,追加写,而以“r+b”则指针不动,接着覆盖文件内容写。
- #/usr/bin/env python
- # -*- coding:utf-8 -*-
- #Author:W-D
- f=open("test","r+b")#以b模式打开已经确定了编码不需要在写encoding
- print(f.tell())
- data=f.readline()
- print(type(data),data)
- print(f.tell())
- f.write(bytes("我",encoding="utf-8"))#将字符串转化为bytes类型
- print(f.tell())
- f.close()
- 结果:
- 0
- <class 'bytes'> b'were the shadow to my light\r\n'#可以看见内容为bytes类型
- 29
- 32
附上处理文件时候使用的常用方法:
- file.close() #关闭文件。关闭后文件不能再进行读写操作。
- file.flush() #刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
- file.fileno() #返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。
- file.isatty() #如果文件连接到一个终端设备返回 True,否则返回 False。
- file.next() #返回文件下一行(迭代器)。
- file.read([size]) #从文件读取指定的字节数,如果未给定或为负则读取所有。
- file.readline([size]) #读取整行,包括 "\n" 字符。
- file.readlines([sizehint]) #读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比sizhint较大, 因为需要填充缓冲区。
- file.seek(offset[, whence]) #设置文件当前位置
- file.tell() #返回文件当前位置。
- file.truncate([size]) #截取文件,截取的字节通过size指定,默认为当前文件位置。
- file.write(str) #将字符串写入文件,没有返回值。
- file.writelines(list) #向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。
文件内容循环:
在对文件的操作过程中,最多的就是读取并处理文件内容,当文件很大的时候,使用read方法一次性读取是非常不明智的,不仅处理慢,还耗内存,此时我们可以使用for循环处理。
示列:
- #/usr/bin/env python
- # -*- coding:utf-8 -*-
- #Author:W-D
- f=open("test","r+",encoding="utf-8")
- for line in f:#一行一行循环读取
- print(line.strip())#打印
- 结果:
- You were the shadow to my light
- Did you feel us
- Another Star
- You fade away
- Afraid our aim is out of sight
- Wanna see us
- Alive
- Where are you now
tps:使用flush实现进度条效果
原理:
使用sys.stdout.write()方法向窗口输入字符(不换行),在使用flush强制刷新内存,打印在输出控制台上。
预备知识:
先说一下文本系统的控制符:
\r: 将光标移动到当前行的首位而不换行
\n: 将光标移动到下一行,并不移动到首位
\r\n: 将光标移动到下一行首位
- #/usr/bin/env python
- # -*- coding:utf-8 -*-
- #Author:W-D
- import sys,time
- for i in range(1,101):
- num="="*i#设置每次打印=好的数量,数量一定要增加
- sys.stdout.write("\r{}>%{}".format(num,i))#"\r"表示每次打印现将光标移动到最前面打印
- sys.stdout.flush()
- time.sleep(0.5)
关于with
为避免我们打开了文件进行操作以后没有关闭,使用with打开文件会自动调用close()方法关闭文件,同时在python2.7以后with也提供了同时打开多个文件的上下文管理。
示列:修改文件
- #/usr/bin/env python
- # -*- coding:utf-8 -*-
- #Author:W-D
- with open("test","r",encoding="utf-8") as f1,open("new.txt","w",encoding="utf-8") as f2:
- for line in f1:
- f2.write(line)#将f1(test)文件内容写入到f2(new.txt)中
二、字符编码解码 |
首先需要了解的知识:
1.在python2x中默认字符编码是ASCII, 而在python3里默认是utf-8
2.unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节),utf-8就是unicode
3.在pyhton3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string
4.更多的编码知识请参考http://www.cnblogs.com/yuanchenqi/articles/5956943.html
日常疑难杂症状之windows编码问题:
以python2.7为例:
python2.7默认字符编码为ASCII,当我们在脚本文件中指定编码为utf-8,但是有时候还是会乱码,示列:
- #/usr/bin/env python
- # -*- coding:utf-8 -*-
- #Author:W-D
- test="你好"
- print(test)
结果:
原因分析:
虽然在代码中指定了编码格式,但是dos窗口编码是gbk,而我们用了utf-8,输出了乱码。ps:查看dos窗口编码方法:点击窗口-->右键-->属性,在当前页面栏。
如果这时候我们使用python3来执行当前的脚本,可以输出中文,因为python3的默认为unicode,unicode兼容gbk。
换个姿势让windows输出中文,这就是接下来要讲的编码解码(代码只适用于python2.x):
- #/usr/bin/env python
- # -*- coding:utf-8 -*-
- #Author:W-D
- test="你好"
- temp=test.decode(encoding="utf-8")
- #解码,首先必须告诉解释器原来是什么编码
- new_test=temp.encode("gbk")#编码,编码为GBK
- print(new_test)#输出
- 结果:
- 你好
在python2中解码编码流程如下:
由于在python3中默认的字符编码改为了unicode,所以对于python3中的编码解码过程如下:
转码示列操作:
python2中:
- #/usr/bin/env python
- # -*- coding:utf-8 -*-
- #Author:W-D
- test="我来了"
- new_test=test.decode("utf-8").encode("gbk")
- #decode必须制定当前编码,由于在脚本头中指定当前编码为utf-8,如果脚本头中没有指定,会采用系统默认编码。
- print(new_test)
- 结果:
- 我来了
python2
在python3中由于默认编码改变,并且编码的时候会将字符串转为bytes类型,若需要输出为字符串类型需要解码。
- #/usr/bin/env python
- # -*- coding:utf-8 -*-
- #设置文件编码为utf-8,为了让系统识别,如果系统文件编码为gbk,该文件将不会被识别。
- #Author:W-D
- import sys
- print (sys.getdefaultencoding())#打印当前系统默认编码(不一定是头中声明的编码)
- test="你好"#该变量的编码是unicode(utf-8),文件编码如果是gbk,该变量编码依然不会改变
- gbk_test=test.encode("gbk")#转码为gbk
- print(gbk_test)#打印
- print(gbk_test.decode("gbk").encode("utf-8"))#gbk转utf-8
- print(gbk_test.decode("gbk"))#将gbk解码为unicode,变成字符串打印
- 结果:
- utf-8
- b'\xc4\xe3\xba\xc3'
- b'\xe4\xbd\xa0\xe5\xa5\xbd'
- 你好
python3
三、函数介绍 |
1.为何使用函数
- 减少重复代码
- 使程序变的可扩展
- 使程序变得易维护
2.语法
- def 函数名(参数):
- ...
- 函数体
- ...
- 返回值
简单示列:
- #/usr/bin/env python
- # -*- coding:utf-8 -*-
- #Author:W-D
- def test(a):
- print("this is %s"% a)
- test("WD")#调用函数
- 结果:
- this is WD
3.函数参数与局部变量
形参:变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量
实参:可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值
示列:
- #/usr/bin/env python
- # -*- coding:utf-8 -*-
- #Author:W-D
- def test(x,y):#x,y为形参
- return x+y#x+y返回值
- a=test(3,5)#返回值保存在a中
- print(a)
- 结果:
- 8
4.函数参数传递
在函数调用的时候,传递的参数有两种,这两种方式可以单独使用,也可以混用,但是要注意一个原则关键字参数必须放在位置参数之后
1.位置参数,按形参位置来传递
2.关键字参数,按形参的参数名传递
示列:
- #/usr/bin/env python
- # -*- coding:utf-8 -*-
- #Author:W-D
- def msg(_name,_age,_city):
- print("name:{},age:{},city:{}".format(_name,_age,_city))
- name="WD"
- age=22
- city="beijing"
- msg(name,age,city)#关键字参数传递
- msg(_name=name,_age=age,_city=city)#位置参数传递
- msg(name,_city=city,_age=age)#关键字和位置参数同时传递
- 结果:
- name:WD,age:22,city:beijing
- name:WD,age:22,city:beijing
- name:WD,age:22,city:beijing
5.设置默认参数和非固定参数
设置默认参数:作用就是当我们没有传递该参数时候,调用函数会传递参数的默认值,当传递了该默认参数的值时候,采用传递的值。
示列:
- #/usr/bin/env python
- # -*- coding:utf-8 -*-
- #Author:W-D
- def test(age,name="WD"):#设置name默认值是WD
- print(name,age)
- test(22) #未传递name
- test(22,"alex")#传递name
- 结果:
- WD 22
- alex 22
非固定参数:若函数在定义时不确定调用时候想传入多少个参数,就可以使用非固定参数
语法:
1.*参数(如*args),该形式会将传入的参数当作数组处理
示列:
- #/usr/bin/env python
- # -*- coding:utf-8 -*-
- #Author:W-D
- def test(name,age,*args):
- print(name,age,args)
- print(type(args))
- test("wd",22,"a","b","c")
- test("jack",38)
- 结果:
- wd 22 ('a', 'b', 'c')#将参数作为一个tuple
- <class 'tuple'>
- jack 38 ()#不传参数就作为空tuple
- <class 'tuple'>
2.**参数(如**kwargs),该形式会将传入的参数作为字典处理
示列:
- #/usr/bin/env python
- # -*- coding:utf-8 -*-
- #Author:W-D
- def test(name,age,**kwargs):
- print(name,age,kwargs)
- print(type(kwargs))
- test("wd",22,jack=22,job="it")#传递的时候key相当于变量=号后是值
- 结果:
- wd 22 {'job': 'it', 'jack': 22}
- <class 'dict'>
6.全局变量与局部变量(这变量为数字,字符串,后面会提及当变量数据类型比较高级的时候,情况不一样了)
- 在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
- 全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
- 当全局变量与局部变量同名时,在定义局部变量的子程序内,局部变量起作用,在其它地方全局变量起作用。
示列:
- #/usr/bin/env python
- # -*- coding:utf-8 -*-
- #Author:W-D
- name ="WD"
- def change_name(name):
- print("before is %s" %name)
- name="jack"#局部变量
- print("after is %s" %name)
- change_name("rose")
- print("finally is %s "%name)
- 结果:
- before is rose
- after is jack
- finally is WD #未改变全局变量
若要修改全局变量,必须首先使用global声明(不推荐修改全局变量)
示列:
- #/usr/bin/env python
- # -*- coding:utf-8 -*-
- #Author:W-D
- name ="WD"#全局变量
- def change_name(_name):
- global name#声明该变量是全局变量
- print("before is %s" %_name)
- name="jack"#局部变量
- print("after is %s" %_name)
- change_name("rose")
- print("finally is %s "%name)
- 结果:
- before is rose
- after is rose
- finally is jack#全局变量修改了
当全局变量为列表,字典,集合,类等这些数据类型的时候,修改局部变量,同样也修改了全局变量。
示列:
- #/usr/bin/env python
- # -*- coding:utf-8 -*-
- #Author:W-D
- name =[1,2,3]#列表类型的全局变量
- def change_name(_name):
- print("before is %s" %_name)
- name[0]="修改了吗"
- print("after is %s" %_name)
- change_name(name)
- print("finally is %s "%name)#打印全局变量
- 结果:
- before is [1, 2, 3]
- after is ['修改了吗', 2, 3]
- finally is ['修改了吗', 2, 3] #修改了全局变量
7.返回值
如果在默写场景下,我们要想获取函数的执行结果,就可以用return语句把结果返回
注意:
- 函数在执行过程中只要遇到return语句,就会停止执行并返回结果,也可以理解为 return 语句代表着函数的结束
- 如果未在函数中指定return,那这个函数的返回值为None
- 返回值可以是字符串、数字、列表、甚至可以是函数
示列:
- #/usr/bin/env python
- # -*- coding:utf-8 -*-
- #Author:W-D
- def add(x,y):
- print("%d+%d=%d" %(x,y,x+y))
- return x>y#返回x>y的结果
- a=add(3,4)
- print(a)
- 结果:
- 3+4=7
- False
python基础3之文件操作、字符编码解码、函数介绍的更多相关文章
- python基础之 列表、元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码
本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 ...
- Python自动化 【第三篇】:Python基础-集合、文件操作、字符编码与转码、函数
1. 集合 1.1 特性 集合是一个无序的,不重复的数据组合,主要作用如下: 去重,把一个列表变成集合实现自动去重. set可以看成数学意义上的无序和无重复元素的集合,因此,两 ...
- python基础语法、数据结构、字符编码、文件处理 练习题
考试范围 '''1.python入门:编程语言相关概念2.python基础语法:变量.运算符.流程控制3.数据结构:数字.字符串.列表.元组.字典.集合4.字符编码5.文件处理''' 考试内容 1.简 ...
- python基础之元组、文件操作、编码、函数、变量
1.集合set 集合是无序的,不重复的,主要作用: 去重,把一个列表变成集合,就可以自动去重 关系测试,测试两组数据的交集,差集,并集等关系 操作例子如下: list_1 = [1,4,5,7,3,6 ...
- Python基础(5)_字符编码、文件处理
一.文件读取过程: 1. 文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开编辑器就打开了启动了一个进程,是在内存中的,所以在编辑器编写的内容也都是存放与内存中的,断电后数 ...
- python基础(7):字符编码
今天我们进入字符编码的学习.字符编码是一个多理论少结论的知识点,我会总结很多的知识点.我们只需要通读当作了解即可,最后我会总结需要我们理解掌握的重点. 一.学习字符编码的计算机基础储备 1.计算机软件 ...
- Python基础7:文件操作
[ 文件操作] 1 对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下: 昨夜寒蛩不住鸣. 惊回千里梦,已三更. 起来独自绕阶行. 人悄悄,帘外月胧 ...
- python学习笔记-(七)python基础--集合、文件操作&函数
本节内容 1.集合操作 2.文件操作 3.字符编码与转码 4.函数操作 1.集合操作 集合是一个无序的.不重复的数据组合: 1.1 常用操作 它的作用是: 1)自动去重:列表变成集合,自动去重: &g ...
- python基础学习之文件操作&函数
1.文件处理相关 1.编码问题 ①python2与python3中的默认编码: py2默认使用ASCII码,py3默认使用utf-8 ②为什么会出现中文乱码,中文乱码的情况有哪些? #sys.stdo ...
随机推荐
- java发起HTTP请求的共用类
一定要注意编码,请求时,content-type里的编码,仅仅是流的编码,而结果的编码类型,则是流转化为字符串是需要设定的. 以下是3种使用get/post的方式: import java.io.Bu ...
- 微信小程序开发--模板(template)使用,数据加载,点击交互
微信小程序视图层提供了 模板(template),可以在模板中定义代码片段,然后在不同的地方调用.结果在数据渲染那懵逼了.按照官网上对模板的说明和对数据的加载. 1.定义模板 使用name属性,作为模 ...
- 使用 jQuery Ajax 异步登录,并验证用户输入信息(maven)
使用 jQuery Ajax 异步登录,并验证用户输入信息(maven) 本篇内容: (1)上一篇是使用同步的请求实现登录,并由 Servlet 决定登陆后下一步做哪些事情,本篇使用 jQuery A ...
- TI(德州仪器) TMS320C674x逆向分析之二
TI官网文档: http://www.ti.com/product/tms320c6745/technicaldocuments 里面资料非常详细,可以对着里面一个个看,用的比较多的两个文档: TMS ...
- Mongodb集群与分片 1
分片集群 Mongodb中数据分片叫做chunk,它是一个Collection中的一个连续的数据记录,但是它有一个大小限制,不可以超过200M,如果超出产生新的分片. 下面是一个简单的分片集群 ...
- sql server复制表数据到另外一个表 的存储过程
) Drop Procedure GenerateData go CREATE PROCEDURE GenerateData @tablename sysname AS begin ) ) ) dec ...
- 通用视图-分开处理GET、POST请求
1.编辑urls.py: url(r'^vmmgmt-vms/$', views.vmmgmt,{'model':models.hvvms,'GET': views.vmmgmt_get_view,' ...
- Vue.js Is Good, but Is It Better Than Angular or React?
Vue.js is a JavaScript library for building web interfaces. Combining with some other tools It also ...
- if 和 elif 的区别
if: 如果一个判断中用if, 程序他会遍历所有的if, 即使你的判断条件遍历到了, 也会继续执行, 直到遍历完所有的if. elif: 而elif呢, 则效率很高. 只要遍历到你的判断条件, ...
- Django商城项目笔记No.18商品部分-数据表创建
数据库表设计 在电商中对于商品,有两个重要的概念:SPU和SKU SPU = Standard Product Unit (标准产品单位) SPU是商品信息聚合的最小单位,是一组可服用.易检索的标准化 ...