第七章 文件操作
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()
-
- 文件读写
- 文件打开方式 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) )
-
-
- 文件按行读写
-
#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())
'''
-
-
- 文件读写指针位置
-
f.tell() #光标位置
f.seek(0) #让光标到达某个位置
import sys,time
for i in range(20):
sys.stdout.write("#")
sys.stdout.flush() #刷新打印进度条?
time.sleep(0.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)
-
- 文件的修改
文件修改
-
- 文件和字符编码(前面也有)
https://blog.****.net/qq_34493908/article/details/79691305
https://blog.****.net/qq_34493908/article/details/79691305
-
-
-
- 字符编码
-
-
python2.X里面字符编码间转换需要先转换为Unicode
如gbk转成utf-8 需要gbk转Unicode 再转为utf-8 反过来也是这样
-
-
-
- 字符编码
-
-
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
总结:编码分三步第一步是unicode编码为utf-8,gbk等,编码时,需要指定编码格式
第二步,转换成type类型,为了传输和保存
第三步,保存或传输到位置后,读取时要解码为unicode类型的字符
解码时,不需要指定编码格式
-
-
-
- 编码转换实例
-
-
# !/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\