python之文件处理

前置疑问

Q1 文本文件和二进制文件?
Q2 一般出现乱码的原因是什么?
Q3 怎么样解决乱码?
Q4 为什么打开文件后,要执行close()方法关闭?
Q5 序列化与反序列化是什么意思?


学习内容

1、常见操作文本文件方法
2、乱码问题
3、序列化pickle
4、操作csv文件


学习产出

1、文件操作

A1

1.文本文件和二进制文件

  • 文本文件:

比如记事本写的就是文本文件,普通的字符文本,word编辑的文档不是文本文件这点要注意。

  • 二进制文件:
    将数据内容用字节来进行存储,无法用记事本打开的。必须用专门的软件进行解码,比如听音乐,看电影,word写的doc文档,这些都是二进制文件。
  1. 打开和读取文件:
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())

python之文件处理

  • 通过代码得到:
方法 说明
open(文件名,[方式]),[编码] 打开文本文件
read() 读取文本文件整个的内容
readline() 读取文本文件一行内容
readlines() 读取文本文件每一行内容,以列表类型返回
close() 关闭资源

r"b.txt" 是以原始方法输入文本文件路径,减少""的输入。 r是只读,如文件不存在,出现异常,encoding="utf-8"以utf-8读取。

A4

  • close()方法
    为什么要用close方法,因为我们写的python程序,是由解释器来执行的,而管理这些文本文件的打开,关闭是操作系统的工作,没打开一个文件需要申请资源,等用完了,自然要把借的资源给还回去,就是释放资源。
    with语句 (上下文管理器),可自动释放资源,简单方便。

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中打开文件内容,发现是乱码
python之文件处理
而去所在目录下,用记事本打开,发现不是乱码
python之文件处理
原因是 用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)

python之文件处理
关于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的图片
python之文件处理
注:图片来自网络。

2、序列化

A5

  1. 序列化和反序列化

用程序写的数据,只在内存中,电脑已关机,内容就消失了;想要把内存里面的内容写入磁盘,就是序列化,将对象转为串行化;反序列化就是将串行化转为对象。

  1. pickle方法实现序列化
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就是两个对象。

3、读取CSV格式文件

  1. CSV文件
    Comma Separated Values 逗号分隔符文本格式,用于数据交换,excel文件,数据库数据导入到处。
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)

python之文件处理
用excel创建的工作簿文件名的后缀是.xlsx 必须重新另存为选择csv文件,如果直接修改文件名的后缀名为.csv会出现问题。
python之文件处理
比如我强制型改掉这个后缀名,就会发生错误,以为是编码问题,试了好几编码都解决不了,才发现文件格式给我破坏了。

上一篇:Python文件处理


下一篇:pd17虚拟机启动器怎么生成?pd17虚拟机启动器生成方法