二、字符编码、文件处理

目录

  一、字符编码

  二、文件处理

一、字符编码

   掌握俩个结论:

#1.Python文件头需要指定编码
#2.python2 与python3在字符编码的区别

  1.1 一个完整的计算机系统可分为三部分

#1.应用程序
#2.操作系统
#3.计算机硬件
  cpu、内存、硬盘

  1.2 文本编辑器读文件的过程:(notepad++,pycharm,word)

#1.先启动notepadd++,将软件加载到内存
#2.将硬盘中的文件内容读入内存
#3.打印到屏幕

 

  1.3 运行python程序的过程

#1.先启动python解释器,(将软件加载到内存)
#2.将test.py的内容读入内存(Python2默认读入编码是ascii码,Python3默认读入编码是utf-8)
#3.解释执行(此时才有了python语法的概念)

 

  1.4 什么是字符编码

    人类字符---->数字(0和1)

    字符编码就是一个由字符转成数字的一个标准

 

 

  1.5 字符编码表  

    ASCII码:只有英文,还有键盘上所有符号,1个英文字母=8bit=1Bytes

  GBK:中文、英文====>数字(0或1)

#1个中文字符==》2Bytes=16bit
#1英文字符==》1Bytes=8bit

  unicode:万国编码

    一般情况:2个Bytes代表一个字符,无论是英文还是中文

 

  utf-8:Unicode Transformation Format

    1英文=1Bytes

    1中文=3Bytes

  

1.6 字符编码结论:

#1.总结1
    #python3解释器默认读取.py文件的编码:utf-8
    #python2解释器默认的读取.py文件的编码:ascii

    可以通过修改文件头的方式,修改默认的字符编码
    #coding:utf-8

#2.总结2:
    #乱码问题出现的关键在于存文件的时候用一种编码,读文件用了另外一种编码
    #保证不乱码的关键在于:文件以什么编码存的就应该以什么编码取

 

  

  1.7 针对2.3运行python程序流程的第三个阶段:

    解释执行

#文件头编码,在运行python程序流程的第三步,解释执行还会用到
    #在Python2中
#coding:gbk
x=''     #创建内存空间,将‘上’的unicode--编码成文件头编码gbk存放
print ([x])    #gbk编码的二进制,1个中文2Bytes,结果['\xc9\xcf']

    #在Python2中
#coding:utf-8
x=''
print ([x])    #utf-8编码的二进制,1个中文3Bytes,结果['\xe4\xb8\x8a']
print (x)        #在cmd下打印,乱码,因为要把值打印出来,就会把文件头utf-8解码成unicode,而cmd下默认是gbk

#python2中的解决办法
#coding:utf-8
x=u''    #直接创建内存空间时,不从unicode--转成--文件头编码,而是直接用unicode编码创建

#在Python3中,就默认都是unicode,因此不用再加u
ps:字符串能用encode()方法,就是unicode类型,如x.encode('gbk'),x为unicode
encode()方法是将类型str按指定编码成bytes类型
decode()方法是将bytes类型按指定解码成str类型 总结:推荐使用Python3
#记住以下三点:
    #1.保证不乱码,就是以什么编码存,就以什么编码取
    #2.Python3默认读文件解码是utf-8;Python2默认是ASCII码;建议是在文件头指定编码,pycharm会自动将.py存的时候也转换成对应的编码,保证实现第1点
    #3.Python3里的字符串在内存里是unicode编码后的二进制;Python2当中的字符串在内存里是unicode--编码成---文件头编码的二进制结果,要想Python2的字符串在内存中也是以unicode存储,在字符串加个小u,eg:u'hello'

 

二、文件处理

# 文件对象=open(文件的路径,mode=文件的打开模式,encoding=字符编码)
# 强调:下述操作涉及两方面的资源
#1、操作系统需要打开文件
#2、f就是一个python的变量
f=open(r'D:\code\SH_weekend_s1\day03\a.txt',mode='r',encoding='utf-8')
data=f.read()
f.close()  # 回收操作系统打开的文件

 

打开文本文件指定编码:
    encoding='utf-8'
        强调:
            1.打开的文件必须是文本文件
            2.encoding指定的字符编码一定要跟文件存时候用的编码一致
            3.不指定encoding,默认使用操作系统默认编码读取或编码,如windows是gbk,linux是utf-8

#防止文件打开后未关闭用with,反斜杠\代表语句换行
with open('a.txt',mode='r',encoding='utf-8') as f,\
        open('aaa.py',mode='r',encoding='utf-8') as f1:
    data=f.read()
    print(data)

 

############文件的打开模式############

#r:默认的打开模式,只读模式,文件不存在则报错
with open('a.txt',mode='r',encoding='utf-8') as f:
    print(f.readable())    #文件是否可读,返回True
    print(f.writable())        #文件是否可写,返回False
    f.write('hello')        #报错

#读取已光标位置为准
with open('a.txt',mode='r',encoding='utf-8') as f:    
    print('第一次')
    print(f.read())    #读取文件所有内容,光标在末尾
    print('第二次')
    print(f.read())    #读取为空

#读取一行
with open('a.txt',mode='r',encoding='utf-8') as f:
    print(f.readline())    #按行读取,读第一行,光标移到下一行
    print(f.readline())    #按行读取,读第二行,光标移到下一行
    print(f.readlines())    #光标所在位置,按行读取作为元素,形成列表


#w:只写模式,文件存在则清空,文件如果不存在则创建
with open('b.txt',mode='w',encoding='utf-8') as f:
    print(f.readable())    #是否可读,返回False
    print(f.writable())    #是否可写,返回True
    f.write('你好啊,小帅哥\n')    #写入内容,不会自动换行,需要\n换行
    f.write('你好啊,小美女')

#将info列表元素按行一一存入文件
#方法一:
with open('b.txt',mode='w',encoding='utf-8') as f:
    info=['床前明月光\n','疑是地上霜\n','举头望明月\n','低头思故乡\n']
    for line in info:
        f.write(line)

#方法二:运用f.writelines(info)
with open('b.txt',mode='w',encoding='utf-8') as f:
    info=['床前明月光\n','疑是地上霜\n','举头望明月\n','低头思故乡\n']
    f.writelines(info)    #将列表内的元素存入文件,不会自动换行,需要\n


#a:只追加模式,文件存在指针直接移动到文件末尾;文件不存在则创建
with open('access.log',mode='a',encoding='utf-8') as f:
    print(f.readable())    #是否可写,返回False
    print(f.writable())    #是否可读,返回True
    f.write('5555555\n')    #追加内容
    f.write('666666\n')        



# 控制文件读写单位的有两种模式:
#1、t:默认的模式
with open('c.txt',mode='wt',encoding='utf-8') as f:
    f.write('今天天气真好')

#报错,除了文本,其他都不能用t模式
with open('1.png',mode='rt',encoding='utf-8') as f:
    f.read()   

#2、b:二进制模式,该模式下读写但都是bytes,该模式下不能指定encoding参数
with open('1.png',mode='rb') as f:
    data=f.read()
    print(data)
    print(type(data))    #bytes类型

#b模式下,读取【文本】文件内容需要指定解码格式
with open('c.txt',mode='rb') as f:
    data=f.read()
    print(data)
    print(data.decode('utf-8'))    #将内容bytes二进制类型解码成utf-8

#b模式下,写入文件内容需要指定编码格式
with open('d.txt',mode='wb') as f:
    f.write('你好aaa\n'.encode('utf-8'))    #将内容编码成'utf-8'保存
    f.write('我好aaa\n'.encode('utf-8'))
#循环读取文件内容(实时显示文件新增的内容)
import time
with open('day03/access.log','rb') as f:
    f.seek(0,2) #第二个参数2:从文件末尾:1,从当前光标位置;0,从文件开头位置
    while True:
        line = f.readline()
        if line:
            print (line.decode('utf-8').strip())
        else:
            time.sleep(0.2) #不用疯狂读取文件追加的内容,间隔0.2秒

   小程序:模拟复制文件功能

import sys
print (sys.argv)
if len(sys.argv) != 3:
    print ('python copyfile.py src_path dst_path')
    sys.exit()
src,dst = sys.argv[1],sys.argv[2]
#r'%s':使用r,防止路径有斜杠\被转义
try:
    with open(r'%s'%src,'rb') as f_src,\
        open(r'%s'%dst,'wb') as f_dst:
        for line in f_src:
            f_dst.write(line)
except Exception as e:
    print ('源文件不存在')

   实现:修改文件内容的效果

#方法一:(代码简洁,但对文件大,对内存消耗大)
with open('src.txt','r',encoding='utf-8') as f:
    data=f.read()
    data=data.replace('宇文护','杨坚')


#方法二:(代码繁琐,但对内存消耗小)
import os
with open('src.txt','r',encoding='utf-8') as f1,\
    open('src_temp.txt','w',encoding='utf-8') as f2:
    for line in f1:
        if '宇文护' in line:
            line=line.replace('宇文护','杨坚')
        f2.write(line)
os.remove('src.txt')
os.rename('src_temp.txt','src.txt')

 

posted @ 2018-04-18 18:19  森林326  阅读(343)  评论(0编辑  收藏  举报