Q1 文本文件和二进制文件?
Q2 一般出现乱码的原因是什么?
Q3 怎么样解决乱码?
Q4 为什么打开文件后,要执行close()方法关闭?
Q5 序列化与反序列化是什么意思?
1、常见操作文本文件方法
2、乱码问题
3、序列化pickle
4、操作csv文件
A1
1.文本文件和二进制文件
比如记事本写的就是文本文件,普通的字符文本,word编辑的文档不是文本文件这点要注意。
try: f = open(r"b.txt","r",encoding="utf-8") print(f.read()) except BaseException as e: print(e) finally: f.close() print("{:-^20}".format("")) with open(r"c.txt","r", encoding="utf-8") as f: print(f.read(4)) print("{:-^20}".format("")) with open(r"c.txt","r", encoding="utf-8") as f: print(f.readline()) with open(r"c.txt","r", encoding="utf-8") as f: print(f.readlines())
方法 | 说明 |
---|---|
open(文件名,[方式]),[编码] | 打开文本文件 |
read() | 读取文本文件整个的内容 |
readline() | 读取文本文件一行内容 |
readlines() | 读取文本文件每一行内容,以列表类型返回 |
close() | 关闭资源 |
r"b.txt" 是以原始方法输入文本文件路径,减少""的输入。 r是只读,如文件不存在,出现异常,encoding="utf-8"以utf-8读取。
A4
3.写文件
A2
编码 | 说明 |
---|---|
ASCII | 用7位表示,2^7 = 128 能表示128个字符,48~ 57表示 0到9是个阿拉伯数字,65 ~ 90为大写的英文字母,97~122表示小写英文字母。 |
ISO08859-1 | 8为单字节字符集,把ASCII码最高位利用起来,新增128空间,在ASCII码上增加了希腊语、泰语、阿拉伯语、西欧语,向下兼容ASCII码。可以说是ASCII码的进阶版。 |
GB2312 | 信息交换用汉字编码字符集,主要用来解决计算机中汉字的处理,收录了6763个汉字,682个符号 |
GBK | GB2312的进阶版,收录了21003个汉字,windows默认编码是GBK |
unicode | 两个字节表示一个字符,所有字符16位,能有2^16 = 65536个字符,python默认为是unicode字符集 |
uft-8 | 不定长编码,每个字符的长度1~4不等,字母一个字节表示,汉字三个字节表示。LInux操作系统默认编码是utf-8 |
而因为编码的方式不一样,所以就会出现乱码问题。如下代码操作:
s = ["明月清风头我心\n","武林外传\n","葵花点穴手\n","i love python\n"] with open(r"test.txt","w") as f: f.write("写入文件\n 编码默认是unicode\n 会出现乱码") f.writelines(s)
pycharm中打开文件内容,发现是乱码
而去所在目录下,用记事本打开,发现不是乱码
原因是 用open()方法时,会向操作系统申请打开,执行者是操作系统,而windows系统默认编码是GBK。用GBK写的文字,再用uft-8去打开,当然会出现乱码。
而在windows文件资源管理器下,用记事本打开,本身就是GBK编码,当然不会出现乱码。
A3
想要在pycharm中打开文本不乱码,解决方法是:encoding=“utf-8”
s = ["明月清风头我心\n","武林外传\n","葵花点穴手\n","i love python\n"] with open(r"test.txt","w",encoding="utf-8") as f: f.write("写入文件\n 编码默认是unicode\n 会出现乱码") f.writelines(s)
关于open()方法打开文件方法的形式:
参数 | 说明 |
---|---|
r | 只读模式,如果文件不存在,抛出异常 |
w | 写入模式,如果文件不存在就新建一个,并写入。如果文件已经存在,将原来内容覆盖掉,写入新的内容。 |
a | 追加模式,如果文件不存在新建一个,并写入,如果文件存在就在文件末尾下一行新增内容 |
b | 二进制模式,可以与其它模式组合,比如读取一个照片 |
+ | 读写模式,可以与其他模式组合 |
with open(r"test.jpg","rb") as f: with open("copy_test.jpg","wb") as w: for line in f.readlines(): w.write(line)
拷贝名为test.jpg的图片
注:图片来自网络。
A5
用程序写的数据,只在内存中,电脑已关机,内容就消失了;想要把内存里面的内容写入磁盘,就是序列化,将对象转为串行化;反序列化就是将串行化转为对象。
import pickle a1 = "明月清风偷我心" a2 = 123321 a3 = {"name":"小明","age":18, "id":20220105} with open(r"data.dat","wb") as f: pickle.dump(a1,f) pickle.dump(a2,f) pickle.dump(a3,f) with open(r"data.dat","rb") as f: b1 = pickle.load(f) b2 = pickle.load(f) b3 = pickle.load(f) print(b1) print(b2) print(b3) print(id(a1)) print(id(b1)) print(a1 is b1)
dump(obj,file) 将对象obj序列化,存储到file文件中
load(file),读取file中的文件,反序列化。
反序列化之后会生成新的对象,尽管内容一样,比如上面a1 和 b1就是两个对象。
import csv with open(r"test_csv.csv",encoding="utf-8") as a: a_csv = csv.reader(a) headers = next(a) print(headers) for row in a_csv: print(row)
用excel创建的工作簿文件名的后缀是.xlsx 必须重新另存为选择csv文件,如果直接修改文件名的后缀名为.csv会出现问题。
比如我强制型改掉这个后缀名,就会发生错误,以为是编码问题,试了好几编码都解决不了,才发现文件格式给我破坏了。