python学习 day7 (3月8日)

read()读出来了之后文件里就从之后开始  光标不知道在哪 

编码的进阶:

背景: 

  ASCII:英文字母,数字,特殊符号,------------>二进制的对应关系

     str:

        一个字符 --------------->一个字节

        a:0001 0000    

    Unicode :万国码:世界上所有文字的  

        1个字符------------》4个字节

        a:0001 00000001 00000001 00000001 0000

        中:0001 00000001 00000001 00000001 0000

    因为上面浪费     

    utf-8 : 至少使用一个

      a:一位映射的ASCII

      中:三位

    gbk:国标

      a:映射的ASCII

      中:三位

    1.不同的编码之间的0101011 是不能互相识别的

    2.网络传输,数据存储到磁盘,-------------->   01010101二进制,不能使用unicod的编码本去编译

    (Unicode) 四位 , 浪费的资源太多

    大背景:  python3X  版本

       str:它在  内存中的编码方式:Unicode   涵盖所有的文字

       但是  写入文件的内容,传输给别人的数据, 一般都是str的形式

    矛盾点: 传输 和 使用 。

    解决: 利用str 发送或者传输(转换,将unicodez转换成非U)----------->发送,传输

    int  

    

    bytes 数据类型

Int

Bool

Str

Bytes  数据类型 与str 几乎一模一样  方法全有基本

List

Dict

Set

Tuple

英文:

Str :

在内存中的编码:Unicode

              表现形式---à: ‘t’

Bytes:在内存中的编码:非Unicode

              表现形式--à:b‘t’

 编码:encode () 默认“utf-8”

# str --------> utf-8  bytes
s1 = 'a太白'
# encode 默认 utf-8
b1 = s1.encode()
b1 = s1.encode('utf-8')
print(b1)#b'a\xe5\xa4\xaa\xe7\x99\xbd'
# str --------> gbk  bytes
s1 = 'a太白'
b1 = s1.encode('gbk')
print(b1)#b'a\xcc\xab\xb0\xd7'

中文:

Str :

在内存中的编码:Unicode

              表现形式---à: ‘t’

Bytes:在内存中的编码:非Unicode

              表现形式--à:b‘t’ 

若只是英文的话可以,但是中文的话表示成16进制

 s1 = b'中国'

        ^

SyntaxError: bytes can only contain ASCII literal characters.

6个

编码:

Str(Unicode) ----->bytes(非Unicode)

S1 = ‘a 太白’

Encode 默认使用 utf-8

B1 = s1.endcode(‘utf-8’)

B1 = s1.endcode(‘gbk’)

 

解码:

  Utf-8 bytes ------>str Unicode

B3 =  b'a\xe5\xa4\xaa\xe7\x99\xbd'

S2 = b3.decode(‘utf-8’) 

终极转换

Utf-8  bytes   gbk bytes

       And gb2312   Utf-16 

 

# 终极转换
# utf-8 bytes --------> gbk  bytes
b3 = b'a\xe5\xa4\xaa\xe7\x99\xbd'
# s = b3.decode()
s = b3.decode('utf-8')
print(s)
b4 = s.encode('gbk')
print(b4) #b'a\xcc\xab\xb0\xd7'

对于 他们的英文 映射的英文的话可以

互相转化 ,特殊情况

 

读文件:(5+5)

 #__author : 'liuyang' 
#date : 2019/3/8 0008
f = open('G:\path.txt',encoding='utf-8',mode='r')
print(f.read())            # utf-8 是 读写 无论什么格式  而且  有的不对 无法编码
#  f变量:f , f1 ,file , file_hander,fh ,f_h...文件句柄.
'''
open()python的内置函数,python提供的一个功能,
底层调用的是操作系统的调用文件命令,接口
windows : 编码: gbk (默认)(国标) 为什么用种问
                (美国用ASCII码)
linux ,mas : 编码是utf-8 .
'''
'''
操作文件的流程:
1,打开文件,产生一个文件句柄
2,对文件句柄进行相应的操作(中间过程多)
3.关闭文件句柄'''
f.close()

 5文件的读:(r r+ rb r+b)

  r 操作:r 

# read () 全读
f1 = open('r模式' ,encoding='utf-8') # 默认是r模式
print(f1.read())
f1.close()

#看他的数据类型
f1 = open('r模式' ,encoding='utf-8') # 默认是r模式
# content= f1.read()

# print(content,type(content))  #字符
# f1.close()
读字节:
 # f1 = open('r模式' ,encoding='utf-8') # 默认是r模式
# print(f1.read(3))
# f1.close()

读每行 和多行 列表(字符串存储)

print(f1.readline())
print(f1.readline().strip()) # 有换行符 去strip()
# print(f1.readline())
print(f1.readlines())   #剩余的 ! 前面也是。 返回一个列表()
                        # 列表的每一个元素 是 字符
f1.close()'''
读大文件的方法:
#  5  循环读取
f1 = open('r模式',encoding='utf-8')
for line in f1:
    print(line)
print(line)
#  在内存之中 只出现 一次 然后显示给显示器
#  下一次 释放了
f1.close()

# w w+ wb w+b
# 没有文件 创建文件写入内容 (写了个 w 模式的文件)
f  = open('w模式',encoding='utf-8',mode='w')
f.write('随便写一点')
f.close()

 先清空后写
f.write('abcdefgh')  # 没空格  一直写
f.write('abcdefgh\n')
f.write('abcdefgh')
f.write('abcdefgh')
f.write('abcdefgh\n')
for i in range(3):
    f.write('abcdefgh\n')
f.close()

文件的读写与输出  复制 粘贴

# wb
f1 = open('image.jpg',mode='rb')
content = f1.read()
f1.close()# 产生了数据 关不关 不影响
f2 = open('image1.jpg',mode='wb')
f2.write(content)
f2.close()

image.jpg-----------------> image1.jpg

追加:

# a 模式 追加 文件的追加
# a ab a+ a+b
# a 没有文件 ,创建文件,写入内容
f = open('a模式',encoding='utf-8',mode='a') f.write('6666') f.close()# 不close() 一直在内存占着 网站开着 以后一直占用

# 先读后写  和追加的区别是什么  可以写进去但是不显示 
f1 = open('r模式',encoding='utf-8',mode='r+')
print(f1.read())
# f1.seek()
f1.write('1')
f1.close() #

r+   先写后读   先读后写 

#  r+ 先读后写  加到最后  
# f = open('r模式',encoding='utf-8',mode='r+')
# content = f.read()
# print(content)
# f.write('dsdjal')
# f.close()
# 先写后读   光标  先写 会替换掉  
f = open('r模式',encoding='utf-8',mode='r+')
f.write('dlaonanhail')
content = f.read()
print(content)
f.close()
print(f)   # 读入的没有写出  还有替换被write 前面的
#第一种 规范代码
# 第二种 把光标放最前面
f1 = open('r模式',encoding='utf-8',mode='r+')
f1.write('111sss1')
# f1.flush()
f1.seek(0)
a = f1.read()
print(a)
f1.close()
# 经常用到的 # r r+ w a # 网络 :rb wb

文件描述符 , 强制保存
f1 = open('r模式',encoding='utf-8') # 默认是读操作
# print(f1.read())
print(f1.fileno()) # 文件描述符
f1.close()
f2 = open('其他操作方法',encoding='utf-8',mode='w')
f2.write('aldjlajll')
# f1.flush()#  强制保存
f1.close()

writeable readable  

f3 = open('r模式',encoding='utf-8') # 默认是读操作
print(f3.readable())
f3.close()
# readable  writeable 判断文件句柄是否可读 可写
if f3.writable():
    f3.write('12222')
f3.close()

seek 的光标 不改变 tr 的截取  截取从头开始 到 字节 处 

#  网络编程 : FTP的作业,断电续传的功能
#  seek  tell              断了之后 获取光标的位置 下次下的时候在此调整到这

f1 = open('r模式',encoding='utf-8') # 默认是读操作
f1.seek(9)     # 默认字节 之后
print(f1.read())
print(f1.tell())#  获取光标的位置
f1.close()

truncate

f1 = open('w模式',encoding='utf-8',mode='w') # 默认是读操作
f1.write('wwajfaldjakgjdlajglajdg')
print(f1)
f1.close()
# truncate # 对源文件进行截取
# 它 必须在可写的情况下适用  a(追加) w r+(读写)  都可写
f1 = open('w模式',encoding='utf-8',mode='r+') # 默认是读操作
#  从开始截9个  只剩下 9个字节
print(f1.truncate(1))
#  seek 不好使  r模式下 是字符  rb 模式下是字节!
# f1 = open('r',encoding='utf-8',mode='rb')
# a = f1.read()
# print(a)
# f1.close()
# 最常用的几个方法 read  seek tell flush readable writeable
# open close 都得写

# 有些时候不需要 写close()
# 一个with 语句可以操作多个文件
# 他是检查 是否操作完 然后 关闭 有时间间隔
# 打开文件的第二种方式
with open('其他操作方法',encoding='utf-8') as f1, \
        open('r模式',encoding='utf-8',mode='w') as f2:
    #付给 f1
    print(f1.read())
    f2.write('da爱活动公交偶就FFljdkj')
    print(f2.write('sjdiasjidj'))  ## 写了多少位 14
# 有些时候不需要 写close()
# 一个with 语句可以操作多个文件
# 他是检查 是否操作完 然后 关闭 有时间间隔
#缺点:with open as 主动关闭 检查
with open('其他操作方法',encoding='utf-8') as f1:
    print(f1.read())
    # 在打开  的过程中  可能会关闭  然后报错IOErrorr
    with open('其他操作方法',encoding='utf-8') as f2:
        pass

 

09 文件的改      文件的改只能采取这种方法把,不能在一个文件里先读后改 只能通过一个中介在同一个文件里写错误 可以追加

1.以读的模式打开源文件

2.以写的模式创建一个新文件

3.将源文件内容读取出来,按照你的要求改成新内容,写入新内容,

4.删除原文件

5.将新文件重命名成原文件

import os
with open('amoshi ',encoding='utf-8'
                         ) as f1 ,\
    open('a模式',encoding='utf-8',mode='w')\
    as f2:

    #low 版 内存太大的操作不了
# old_content = f1.read() # new_content = old_content.replace('alex','sb') # f2.write(new_content)

for old_line in f1: new_line = old_line.replace('sb','alex')# 有就改 没有也不报错 f2.write(new_line) #字符串操作 # 4.删除原文件 os.remove('amoshi ') #5.将新文件重命名成原文件''' # python相同目录下 os.rename('a模式','amoshi ')

 浅copy   一个代码块和两个代码块一样     深浅copy   在于  可变的不一样  共用的没区别

深copy

#__author : 'liuyang' 
#date : 2019/3/8 0008
'''
09 文件的改

1.以读的模式打开源文件 open r

2.以写的模式创建一个新文件 w

3.将源文件内容读取出来,按照你的要求改成新内容,写入新内容,
a = old b = replace()

4.删除原文件

5.将新文件重命名成原文件'''
# low 版
'''
import os
with open('amoshi ',encoding='utf-8') as f1 ,\
open('a模式',encoding='utf-8',mode='w')as f2:
# old_content = f1.read()
# new_content = old_content.replace('alex','sb')
# f2.write(new_content)
for old_line in f1:
new_line = old_line.replace('sb','alex')# 有就改 没有也不报错
f2.write(new_line)
#字符串操作
# 4.删除原文件
os.remove('amoshi ')
#5.将新文件重命名成原文件 # python相同目录下
os.rename('a模式','amoshi ')
'''
# f = open('amoshi',encoding='utf-8',mode='r')
# a=f.read()
# f1=open('a' ,encoding='utf-8',mode='w')
# f =a.replace('alex','sb')
# f.close()
# f1.close()
# 不行

# 深浅 copy
# 赋值运算 变量指的是同一个
l1 = [1,2,3,[11,22]]
l2 = l1 # 鲁迅 = 周树人
# 共用一个
# 元组的列表也可以
l2.append(666)
l2[-2].append(666)
print(l1)
print(l2)

# 浅 copy # 面试题考的较多 深浅copy
#copy 复制,浅浅的复制一份
# lisT dict set 都可以
l1 = [1,2,3,[11,22]]
l2 =l1.copy()

# 只是copy了一个列表 元素还是沿用了之前的元素
# copy 了一个外壳

# 整容 成一样的了 但是不一样人
print(id(l1))
print(id(l2))
# 内存地址不一样

# 元素内存地址一样
print(id(l1[0]))
print(id(l2[0]))
# l1 变 l2 不变 内存里的两个
l1.append(666)
print('前:',l1)
print(l2)

#
l1[-2].append(22)
print(l1)
print(l2)
# 浅 copy: 复制一个外壳(列表),
#但是列表里面的所有元素,都共用一个。
# 深copy:深深的复制一下
import copy
l1 = [1,2,3,[11,22]]
l2 = copy.deepcopy(l1)
print(id(l1),id(l2))
# 不可变数据类型 共用 指向同一个
print(id(l1[0]))
print(id(l2[0]))

# 可变的数据类型 不共用一个
print(id(l1[-1]))#43439688
print(id(l2[-1]))#43378888

# 不改变
l1[-1].append(222)
print(l1)
print(l2)
# 深copy:同一个代码块不同代码块
#不仅创建一个


# 浅copy 只 copy 一个外壳
# 其它的内容全部共用

 

# 下周一 上午 总结知识点
#(知识点,带着做题)
# 晚上考试

 

 

写文件  和 追加 文件  'w'和 ‘a’  没有文件创建一个新文件
with open('wenjian' , 'w' , encoding='utf-8')
with open('wenjian' , 'a' , encoding='utf-8')
posted @ 2019-03-08 10:32  learnacode  阅读(218)  评论(0编辑  收藏  举报