第七章 文件操作

data=open("yesterday").read()

print(data) 

显示错误原因是 ,window默认gpk编码 打开文件时默认用gpk编码打开,

但是pycharm在yesterday创建时用utf-8编码(即utf-8编码的文件)

所有在这里打开时,需要指定编码方式

data=open("yesterday",encoding="utf-8").read()
print(data)

正规写法

f = open("yesterday2","r",encoding="utf-8") #文件句柄

意义在于:打开文件在内存中形成对象   并把对象付给变量f,

这个对象又叫做句柄,

句柄包括:文件的名字,字符集,大小,硬盘中的起始位置。

操作句柄,就是操作对象,就会从硬盘指定位置,读写等

data=f.read()

    1. 文件读写   
      1. 文件打开方式  r w a 等等  没搞清楚??

__author__ = "Alex Li"

'''

#data = open("yesterday",encoding="utf-8").read()

f = open("yesterday2",'a',encoding="utf-8") #文件句柄

#a = append 追加

 

f.write("\nwhen i was young i listen to the radio\n")

data = f.read()

print('--read',data)

 

f.close()

'''

 

 

#f = open("yesterday2",'r+',encoding="utf-8") #文件句柄 读写

#是追加写,无法移动光标到前面插入写入,就是不能修改,

#这个是因为文件已经顺序保存在硬盘,不可以在硬盘上顺序插入数据,

或者说python3,还没有设置这种机制来保存,这与文件插入不一样

#f = open("yesterday2",'w+',encoding="utf-8") #文件句柄 写读

#是先创建一个文件,然后再操作,无法移动光标到文中插入写入,就是不能修改

#f = open("yesterday2",'a+',encoding="utf-8") #文件句柄 追加读写

#追加读写,也不可以插入

f = open("yesterday2",'wb') #文件句柄  二进制文件

f = open("yesterday2",'rb') #文件句柄  二进制文件

f = open("yesterday2",'ab') #文件句柄  二进制文件

====================================================

f = open("yesterday2",'wb+') #文件句柄  二进制文件

f = open("yesterday2",'rb+') #文件句柄  二进制文件

f = open("yesterday2",'ab+') #文件句柄  二进制文件

f = open("yesterday2",'wb') #文件句柄  二进制文件

 

f.write("hello binary\n".encode())  #二进制需要转为bytes   默认编码utf-8

f.close()

 

 

 

 

'''

 

print(f.encoding)

 

#print(f.flush())

print(dir(f.buffer) )

      1. 文件按行读写

#high bige

 

count = 0

for line in f:        #这是逐行读写 类似生成器?

    if count == 9:

        print('----我是分割线----------')

        count += 1

        continue

    print(line)

    count +=1

 

#low loop

 

for index,line in enumerate(f.readlines()):     #这是全部读写

    if index == 9:

        print('----我是分割线----------')

        continue

    print(line.strip())

#for i in range(5):

#    print(f.readline())

'''

      1. 文件读写指针位置

f.tell()  #光标位置

f.seek(0) #让光标到达某个位置

import sys,time

 

for i in range(20):

    sys.stdout.write("#")

    sys.stdout.flush()    #刷新打印进度条?

    time.sleep(0.1)

 

      1. 文件打开简单模式

import sys

#f = open("yesterday2","r",encoding="utf-8")

 

with open("yesterday2","r",encoding="utf-8") as f ,\

      open("yesterday2", "r", encoding="utf-8") as f2:

    for line in f:

        print(line)

    1. 文件的修改

文件修改

 

    1. 文件和字符编码(前面也有)

https://blog.csdn.net/qq_34493908/article/details/79691305

https://blog.csdn.net/qq_34493908/article/details/79691305

        1. 字符编码

python2.X里面字符编码间转换需要先转换为Unicode

如gbk转成utf-8     需要gbk转Unicode 再转为utf-8   反过来也是这样

        1. 字符编码

python3.X 里面字符编码和转换问题

Python种编码注意事项:

(1)在python2默认编码是ASCII,python3里默认是Unicode

(2) Unicode一般为两个字节,utf-8一般为1-4个字节,字符文件不管是gbk或utf-8,读取到内存里时,都转换为Unicode,(一般系统都支持Unicode)所以不会乱码,此时字符可以做encode编码,

当编码为gbk时,同时转换为bytes类型二进制,汉字“中”显示为b'\xd6\xd0'

当编码为utf-8时,同时转换为bytes类型的二进制,汉字“中”显示为b'\xe4\xb8\xad'

为什么要进行编码,因为unicode编码后,字符就编码为(utf-8,gbk)对应二进制类型,就可以进行传输,或者存储为文件,当文件读取是要告诉系统文件是什么编码,将二进制文件用对应的编码解码,成为Unicode类型的字符,显示在屏幕上。

 

(3)在py3中encode,在编码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string

https://img-blog.csdn.net/20170902213238848?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbG92ZWxpdXp6/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

总结:编码分三步第一步是unicode编码为utf-8,gbk等,编码时,需要指定编码格式

                第二步,转换成type类型,为了传输和保存

                第三步,保存或传输到位置后,读取时要解码为unicode类型的字符

                                                   解码时,不需要指定编码格式

        1. 编码转换实例

# !/usr/bin/env python 
# -*- coding:utf-8 -*- 
# Author:
别人的 
# Python3中实现gb2312编码转utf-8编码转gbk编码 


s = "你好"
print(type(s))
print(s)
unicode_to_gb2312 = s.encode(
"gb2312")
print(type(unicode_to_gb2312))
print(unicode_to_gb2312)
gb2312_to_utf8 = unicode_to_gb2312.decode(
"gb2312").encode("utf-8")
print(type(gb2312_to_utf8))
print(gb2312_to_utf8)
utf8_to_gbk = gb2312_to_utf8.decode(
"utf-8").encode("gbk")
print(type(utf8_to_gbk))
print(utf8_to_gbk)

# 运行结果:  # <class 'str'>  # 你好  # <class 'bytes'>  # b'\xc4\xe3\xba\xc3'  # <class 'bytes'>  # b'\xe4\xbd\xa0\xe5\xa5\xbd'  # <class 'bytes'>  # b'\xc4\xe3\xba\