博客核心内容:


1、Python基础之字符编码的介绍
2、Python中文件处理的介绍
3、Python中函数的介绍
4、 File.readlines(sizehint) 函数


一、Python基础之字符编码的介绍

在Python当中,字符编码的问题贯穿整个学习的始终,下面详细的介绍一下字符编码的相关知识,主要介绍内容:
①文本编辑器(nodepad++、word、pycharm)存取文件的原理.
②Python解释器执行py文件的原理.
③字符编码的相关概念.
④字符编码的分类.


1、文本编辑器(nodepad++、word、pycharm)存取文件的原理
打开文本编辑器相当于启动了一个应用进程,是在内存中的,所以在编辑器中编写的内容也都是存放在内存中的,为了防止断电后数据丢失,我们需要将数据由内存保存到磁盘中去,点击保存按钮,就从内存中将数据刷到了硬盘上。
所以当我们打开pycharm这个编辑器编辑文件(没有执行),跟其他编辑器编写文件没有任何区别,都只是在编辑一堆字符而已。
如果所示:pycharm、nodepad++对应的应用进程。


2、Python解释器执行py文件的原理,例如D:\Python34>python.exe C:\Users\zhangmingyang\Desktop\2.py。
①:python解释器启动,此时就相当于启动了一个文本编辑器,
②:python解释器相当于文本编辑器,去打开test.py文件,从硬盘上将test.py的文件内容读入到内存中,
③:python解释器解释执行刚刚加载到内存中test.py的代码。

D:\Python34>python.exe  C:\Users\zhangmingyang\Desktop\2.py
亲你好,请输入指定的序号选择对应的服务
1、查看之前的购物记录
2、购买商品
q、退出当前购物提供

在这里面插入一句话:
各种高级语言Java、Python本质上就是一种软件,这些软件有的叫做解释器,有的叫做虚拟机,下面我们看到的这个文件夹实际上就是一个Python软件,即Python解释器。

语言分为两种:C语言和其他高级语言。
其他高级语言会先转化成字节码 ,然后在转化成机器码,最后在交给计算机去执行,而C语言是直接转化成机器码,然后在交给计算机去执行。
总结:
python解释器是解释执行文件内容的,因而python解释器具备读py文件的功能,这一点与普通文本编辑器是一样的,与普通文本编辑器不一样的地方在于,python解释器不仅可以读文件内容,还可以执行文件内容


3、字符编码的相关概念
由于在上一篇我的博客里对字符编码的概念已经做了介绍,这个就不在介绍了,贴一下相关链接:
http://blog.csdn.net/a2011480169/article/details/71435114


4、字符编码的分类(我个人认为这个知识点及其重要)
字符编码的分类:ASCII编码、Unicode编码、UTF-8编码、GBK编码。
ASCII编码:这种编码格式是用8位即一个字节来表示一个字符,所以ASCII编码最多只能表示出256个字符。
如:A这个字符对应的ASCII编码格式为0100 0001。
缺点:ASCII编码无法将世界上的各种文字和符号全部表示出来,主要用于表示英文字符、键盘上的所有其它字符和拉丁文。
Unicode编码:这种编码格式规定至少用两个字节(即16位)来表示一个字符,解决了所有字符和符号的编码问题,可以兼容万国语言。
优缺点:简单粗暴,所有字符都是2字节,优点是字符->数字的转换速度快,缺点是占用空间大,对于用传统ASCII编码就可以表示的字符来说(比如通篇都是英文的文本),这种编码格式多了一倍的存储空间(二进制最终都是以电或者磁的方式存储到存储介质中的)。
UTF-8编码:这种编码格式是对Unicode编码的压缩和优化,将所有的字符和符号进行分类:对英文字符只用1个字节表示,对中文字符用3个字节表示。
优点:精准,对不同种类的字符用不同长度的字节来表示,节省空间,缺点:字符->数字的转换速度慢,因为每次都需要计算出字符需要多长的字节才能够准确表示。
总结:
内存中使用的编码是Unicode编码(快),用空间换时间(程序都需要加载到内存才能运行,因而内存应该是尽可能的保证快)
,硬盘中或者网络传输用utf-8,网络I/O延迟或磁盘I/O延迟要远大与utf-8的转换延迟,而且I/O应该是尽可能地节省带宽,保证数据传输的稳定性。
gbk:这种编码格式是用16位即两个字节来表示一个汉字字符,但是不能解决汉字和英文以外的字符的编码问题,是专门针对中文的编码格式。
优点:对于同一个汉字,使用gbk编码在底层是以两个字节来进行的表示,而utf-8却是用三个字节来进行表示。
缺点:利用gbk这种编码只能解决汉字以及基本英文字符的存储问题。
大致列表如下:

编码与解码的过程图:
encode(内存到硬盘的存储过程):将内存中的unicode编码编码成硬盘中的utf-8(else)编码,这个过程就是encode。
decode(硬盘到内存的解码过程):将硬盘中的utf-8(else)编码解码成内存中的unicode编码,这个过程就是decode。
文件中的内容在没有执行之前,文件中的内容在内存当中统一以unicode编码格式保存的,但是执行过程当中可能转化成其他格式的编码。

核心总结:
无论是何种编辑器,要防止文件中的内容出现乱码,核心法则就是,文件中的内容以什么编码格式保存的,就以什么编码方式打开这个文件。
PyCharm这个软件的好处就在于文件中的内容以哪种编码格式打开,文件中的内容默认就以哪种编码格式保存。
部分代码示例:

#!/usr/bin/python
# -*- coding:utf-8 -*-    #指定读文件的编码格式x = "李杰"#unicode---->encode---->utf-8(字节码)
print(x.encode("utf-8"))   #字节码#unicode---->encode---->gbk(字节码)
print(x.encode("gbk"))     #字节码user_name = "李杰"
user_2 = user_name.encode("utf-8")
print(user_2)
print(user_2.decode())  #decodeprint(user_name.encode("utf-8"))
print(user_name.encode("gbk"))

运行结果:

b'\xe6\x9d\x8e\xe6\x9d\xb0'
b'\xc0\xee\xbd\xdc'
b'\xe6\x9d\x8e\xe6\x9d\xb0'
李杰
b'\xe6\x9d\x8e\xe6\x9d\xb0'
b'\xc0\xee\xbd\xdc'
一、Python中文件处理的介绍

我将Python中对文件处理常用的方法总结如下:

在文件处理当中,只有read默认是以字符为单位,其他方法均已字节为单位.def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True):file表示文件的名称,可以是绝对路径,也可以是相对路径.mode表示打开文件的方式,r表示读,w表示写,a表示追加.encoding表示已哪种编码格式读取文件中的内容,如果不指定,默认使用当前平台的编码,对于Windows操作系统来说为gbk编码.open()成功返回一个文件对象后,后续对该文件的操作都通过这个“句柄”实现。打开文件的三种方式:
r : 以r的方式打开整个文件,若文件不存在,则直接报错
w : 以w的方式打开整个文件,若文件存在则先清空文件的内容(但是并不删除文件),若文件不存在则先创建这个文件。
注意:在以w的方式打开整个文件的过程中,只有在第一次打开文件的时候才会先清空整个文件的内容,在整个操作的过程中
并不会写一次清除一次。
r和w代表以文本的方式读,并以文本的方式写。
a : 以追加的方式打开整个文件,若文件不存在则先创建这个文件,若文件存在则只追加内容。"+" 表示可以同时读写某个文件r+, 读写【可读,可写】,文件不存在会报错的w+, 写读【可读,可写】, 清空文件内容,然后以读写方式打开文件。a+ ,写读【可读,可写】"b"表示已字节流的方式操作相应的文件,当以"b"的方式操作文件的时候,
处理数据的基本单位是字节(二进制),而不再是字符。rb,  以二进制的方式读写某个文件          (直接将文件在硬盘中对应的bytes读取到内存当中)wb,  以二进制的方式向某个文件中写入内容。(直接将文件对应的bytes写到硬盘当中)def close(self, *args, **kwargs): 程序结束之后要注意关闭流从而释放与该流相关的所有系统资源.def read(self, *args, **kwargs): read()从文件中读取指定个数的字符(r模式)或者字节(rb模式),如果没有给定参数size(默认-1)或为负数,则一直读至末尾,获取整个文件的内容。def write(self, *args, **kwargs): 向文件中写入字符串,并返回写入字符的个数,注意:要自己添加相应的换行符。def writelines(seq)    向文件中写入一个字符串列表,注意:seq中的每个元素必须是字符串类型.def readable(self):判断文件的打开方式是否是可读的,如果是则返回True.def writable(self, *args, **kwargs): 判断文件的打开方式是否是可写的,如果是则返回True.def seek(self,offset,whence=0): 控制文件光标位置移动的字节数,whence=0代表文件的开始位置.whence=1代表光标所处的当前位置whence=2代表文件的结束位置.注意:seek处理数据的单位为字节。def tell(self, *args, **kwargs): 当前文件中光标所处的位置.def readline(self, *args, **kwargs): 读取一行文本,并随后将光标转移至下一行的起始偏移量。def readlines(self, hint=-1):读取文件所有行文本的内容,并以列表的形式进行返回。def truncate(self, *args, **kwargs): 截取文件的内容,其中结果只保留前n个字节的内容。文件操作的其他功能:
文件的修改:
1、读源文件的内容,然后一行一行的向新文件中写.
2、通过os模块将源文件给删除.
3、将新文件重命名为源文件的名字。

示例程序1:文件修改的示例程序

#!/usr/bin/python
# -*- coding:utf-8 -*-import os#以读的方式打开一个文件
fr1 = open("aa.txt",mode="r",encoding="utf-8")
#以写的方式打开一个文件
fr2 = open("bb.txt",mode="w",encoding="utf-8")#读取源文件的内容,并将文件中的内容一行一行的写的新的文件当中
for line in fr1.readlines():if line.strip() == "11111111":line = "66668888\n"fr2.write(line)fr1.close()
fr2.close()#删除源文件
os.remove("aa.txt")
#将目标文件重名为源文件
os.rename("bb.txt","aa.txt")with可以同时处理多个文件:
with open("aa.txt",encoding="utf-8") as fr1 , open("bb.txt",encoding="utf-8") as fr2:print(fr1.read())print(fr2.read())

示例程序2:“b”字节流(二进制)的方式操作文件

#!/usr/bin/python
# -*- coding:utf-8 -*-with open("aa.txt","rb") as fr1:#以二进制串的方式读取某个文件,并通过utf-8格式的编码进行解码#fr1.read()相当于将文件中的二进制串直接拷贝到内存当中data = fr1.read().decode(encoding="utf-8")print(data)with open("aa.txt","rb") as fr, \open("bb.txt","wb") as fw:data = fr.read()fw.write(data)with open("cc.txt","wb") as fw2:#将李杰这两个汉字以utf-8这种编码格式的二进制串写到计算机的硬盘当中fw2.write("李杰".encode("utf-8"))

示例程序3:模拟tail -F word.txt查看文件结尾最新的变化

#!/usr/bin/python
# -*- coding:utf-8 -*-with open("aa.txt","r",encoding="utf-8") as fr1:#在文件的结束文件向右偏移0个字节,直接到文件的末尾fr1.seek(0,2)while True:line = fr1.readline().strip()if line:print(line)
三、Python中函数的介绍(上)

我自己总结了一下Python中函数的一些重要知识:

Python中函数的参数详细可以分为5种:
1、位置参数
def fun(x,y,z) :x、y、z为位置参数,特点:必须被传值的参数,并且实际参数的数值与形式参数的数值一一对应。2、关键字参数(类似于Scala中的带名参数)
def fun(x,y,z) ==>  fun(z=3,x=1,y=2) 特点:关键字的参数必须在位置参数的后面,并且不能重复对一个形式参数
赋值。3、默认参数
def fun(name,age,sex="man") : sex为默认参数, 特点:函数调用的时候默认参数可以不用被赋值,默认参数必须跟在
非默认参数的后面;默认参数在定义阶段就已经赋值了,而且只在定义阶段赋值一次;默认参数的数值通常定义为不可变
类型。4、可变长参数(*args,**kwargs)
def fun(*args,**kwargs):在调用函数时,实际参数的长度是可以改变的。
特点:*args     *会把溢出的按位置定义的实参都接收,并以元组的形式赋值给args。1,2,3,4 <====> *(1,2,3,4),*对应位置参数来看待。**kwargs  **会把溢出的按关键字定义的实参都接收,并以字典的形式赋值给kwargs。**对应的就是关键字。#fun(*[A,B,C]) 等价于  fun(A,B,C)#fun(x=1,y=2)  等价于  **{x:1,y:2}5、命名关键字参数
def foo(name,age,*,sex='male',height): (了解一下即可)
特点:*后定义的参数为命名关键字参数,这类参数,必须被传值,而且必须以关键字实参的形式去传值.注意:各种参数可以混合使用,但是使用的场景为0,因为各类参数之间会相互影响,取消相互的意义。

实例程序1:可变长参数的示例

#!/usr/bin/python
# -*- coding:utf-8 -*-def fun(*args):sum = 0for num in args:sum += numreturn sumsum = fun(10,20,30)
print(sum)

示例程序2:可变长参数的使用

#!/usr/bin/python
# -*- coding:utf-8 -*-def fun(x,y,**args):print(x,y,args)fun(10,20,name="Alex",age=15,times=3)

示例程序3:可变长参数的理解转换(很重要)

def wrapper(*args,**kwargs):print(args)         #args=(1,2,3)print(kwargs)       #kwargs={a:1,b:2}foo(*args,**kwargs) #foo(*(1,2,3),**{a:1,b:2}) #foo(1,2,3,a=1,b=2)wrapper(1,2,3,a=1,b=2)
4、 File.readlines(sizehint) 函数

转载网址:http://blog.csdn.net/holy_phoenix/article/details/1616994
OK,总结到这里,如有问题,欢迎留言指正!

深入理解Python中的字符编码、文件处理和函数相关推荐

  1. python中gbk字符原因报错_深入理解Python中的字符和编码,结合,了解,与

    一.前言 在学习python初期,常常会对运行文件出现的各种"codec"报错摸不着头脑有没有? 对各种编码方式的区别和适用的情况混淆有没有? 对python2,python3 编 ...

  2. 【转】python中的字符数字之间的转换函数

    int(x [,base ])         将x转换为一个整数     long(x [,base ])        将x转换为一个长整数     float(x )               ...

  3. python中的字符数字之间的转换函数

    转自http://www.cnblogs.com/wuxiangli/p/6046800.html int(x [,base ])         将x转换为一个整数 long(x [,base ]) ...

  4. python2发送http不编码_[转]Python 2.x中常见字符编码和解码方面的错误及其解决办法...

    Python 2.x中的字符编码,设计的的确不好,导致初学者,甚至是即使用Python很长时间的人,都会经常遇到字符编解码方面的错误. 下面就把一些常见情,尽量的都整理出来,并给出相应的解决办法. 看 ...

  5. Python基础—Py字符编码

    文章目录 前言 1 计算机基础知识 2 文本编辑器存取文件的原理 3 python解释器执行.py文件的原理 4 总结python解释器与文件本编辑的异同 一.字符编码介绍 1 什么是字符编码 2 P ...

  6. python采用的编码是什么意思_深入浅出地,彻彻底底地理解Python中的编码

    python处理文本的功能非常强大,但是如果是初学者,没有搞清楚python中的编码机制,也经常会遇到乱码或者decode error.本文的目的是简明扼要地说明python的编码机制,并给出一些建议 ...

  7. python中gbk字符原因报错_不想再被鄙视?那就看进来! 一文搞懂 Python 2 字符编码...

    原标题:不想再被鄙视?那就看进来! 一文搞懂 Python 2 字符编码 程序员都自视清高,觉得自己是创造者,经常鄙视不太懂技术的产品或者QA.可悲的是,程序员之间也相互鄙视,程序员的鄙视链流传甚广, ...

  8. Python自动化开发 - 字符编码、文件和集合

    本节内容 字符编码 文件操作 集合 一.字符编码 1.编码 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.解决思路:数字与符号建立一对一映射,用不同数字表示不同符号. ASCI ...

  9. python 检测文件编码_[常用] 在Python中检测网页编码

    [常用] 在Python中检测网页编码 在使用Python抓取网页并进行分析时出现这个错误: UnicodeDecodeError: 'utf8' codec can't decode byte 0x ...

最新文章

  1. babel 转换箭头函数
  2. [记录]-Cortex-A76仅EL0支持aarch32
  3. 实验7.2 二维数组 7-5 打印杨辉三角
  4. 34观察者模式(Observer Pattern)
  5. BurpSuite下载CA证书
  6. LeetCode 25 Reverse Nodes in k-Group Add to List (划分list为k组)
  7. xcode打包ipa_codesign签名ipa
  8. 卸载不了mysql2008_你还在为无法完美卸载SQL Server 2008 R2而烦恼吗?
  9. Mentor Xpedtion partsymbolcell
  10. win7如何显示文件扩展名?
  11. 直播系统 java_直播系统软件定制开发
  12. Gif动图如何裁剪?收下这个图片在线裁剪工具
  13. 钱塘湖春行 白居易 唐代
  14. DCloud是什么?
  15. 【githubshare】基于 C 语言编写的一款 2D 太空射击游戏,已在 Windows 10 和 Ubuntu Linux 16.04 系统上跑通测试
  16. 无法登陆github的解决方法
  17. 福大计算机专硕扩招,【今日话题】福州大学数计学院研究生又又又扩招?什么是拟录取补录?...
  18. java首字母大写工具类_StringUtil 字符串工具类 将一个字符串的首字母改为大写或者小写 将一 联合开发网 - pudn.com...
  19. 如何使用msysgit上传本地工程到GitHub
  20. FPGA-Xilinx 7系列FPGA DDR3硬件设计规则

热门文章

  1. 困惑度PPL (perplexity)
  2. 定制APP和模板APP的区别
  3. 《安全周报》2011年5月第3期
  4. (一)安装虚拟机,并虚拟Ubuntu系统
  5. python爬虫之下载盗墓笔记(bs4解析HTML)
  6. 我们最终还是放弃迁移到微服务,为什么?
  7. 【数据结构】:实现顺序表各种基本运算的算法
  8. java中HTTP的返回状态码
  9. springboot升级log4j2,解决漏洞问题
  10. R语言从入门到入土--一文带你解锁ggplot2绘图大法