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 ...
随机推荐
- 比较完整的PeopleSoft工具表名
因为找不到其他地方有相对完整的PeopleSoft表名,因为我自己总结了一份. 在这里尝试提供一个庞大的PeopleSoft表列表,以便当你想快速访问PeopleSoft工具表时候,可以快速的查看这篇 ...
- MSCRM中报表开发一:创建基于SQL报表
1. 新建报表项目.打开SQL Server Business Intelligence Development Studio,点击 文件 > 新建 > 项目,项目类型选择 商 ...
- Android系统定制和源码开发以及源码编译(附视频)
Android系统定制配套视频: 为了把Android系统源码定制和编译的课程讲完,从准备到录制完所有的视频,一共花去了近半年的时间,前前后后各种下载源码,编译源码,系统不兼容,版本适配,虚拟机配置困 ...
- 带你从零学ReactNative开发跨平台App开发(二)
ReactNative跨平台开发系列教程: 带你从零学ReactNative开发跨平台App开发(一) 带你从零学ReactNative开发跨平台App开发(二) 带你从零学ReactNative开发 ...
- Android 经典欧美小游戏 guess who
本来是要做iOS开发的,因为一些世事无常和机缘巧合与测试工作还有安卓系统结下了不解之缘,前不久找到了guess who 源码,又加入了一些自己的元素最终完成了这个简单的小游戏. <?xml ve ...
- using 和try/catch区别和注意点
书上解释: using: 在C#和其他托管语言中,没有自动.决定性的析构方式,而是有一个垃圾收集器,它会在未来的某个时刻释放资源.它是非决定性的,因为我们不能确定这个过程在什么时候发生.忘记关闭数据库 ...
- org.postgresql.util.PSQLException: 栏位索引超过许可范围:3,栏位数:2。
org.postgresql.util.PSQLException: 栏位索引超过许可范围:3,栏位数:2. 今天在写完SQL进行查询的时候,后台一直报错显示上面的信息.看错误完全不知道原因,就重新检 ...
- Java语法基础(四)----循环结构语句
一.循环结构: 循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则 ...
- LeetCode题解之Convert BST to Greater Tree
1.题目描述 2.问题分析 使用一个vector将所有节点的值以升序排列.然后比较,求和,加上. 3.代码 TreeNode* convertBST(TreeNode* root) { if (roo ...
- Web Services 根据wsdl生成代理类
生成代理类步骤: 一:找到Visual Studio 的工具文件夹 二:用管理员方式打开本机工具命令提示 三:输入要执行的脚本 wsdl /language:C# /n:xxxx.HermesMobi ...