9_文件的操作

目录

文本文件与二进制文件

文本文件

二进制文件

创建文本对象

字符串前面加 r 的意图

open()

文本文件的读写

基本操作

编码知识

close() 关闭文件

with 上下文管理器

文件的读取

读取方式

按行读取(两种)

enumerate() 的使用

二进制文件的读写

拷贝

文件基本操作

seek

序列化与反序列化

CSV文件操作

读取和写入

OS模块

调用操作系统可执行文件

文件和目录操作

os.path模块

walk

shutil 模块(拷贝与压缩)

 


文本文件与二进制文件

文本文件

存储普通“字符”文本,能用记事本打开,默认为 Unicode 字符集。

两个字节表示一个符号。最多表示 65536 个。

二进制文件

内容通过“字节”存储,不能用记事本正常打开。

常见的有:MP4,JPG,MP3,doc

创建文本对象

字符串前面加 r 的意图

a = 'aaa\nasdasdad'
b = r'aaa\nasdasdad'
c = 'aaa\\nasdasdad'

print(a)
print("###############")
print(b)
print("###############")
print(c)

###############################################
aaa
asdasdad
###############
aaa\nasdasdad
###############
aaa\nasdasdad
###############################################

使特殊字符表现为正常字符,如我们需要  \n 而不是换行符,只需要加 r 或 R,但是要紧贴引号

                                                                                                也可以 \\n 表示普通字符 \n

在打开文件的时候也是如此,文件路径可能会被误以为是特殊字符

open()

f1 = open(r"C:\Users\Lu\Desktop\homework.txt", "r")
f2 = open(r"C:\Users\Lu\Desktop\homework.docx", "br")
f1.close()
f2.close()

 open( "文件路径, 要有后缀", "模式", "缓存" )

查询:传送门

文本文件的读写

基本操作

f = open(r'b.txt', "a")          # a 追加模式,有这个文件指针指向结尾,没有则创建文件
f.write(r"leoluxx......")        # 在 venv 下创建了新的文件为 a , 内容如括号所示
f.close()                        # 要记得关闭,不然会浪费资源

编码知识

1. ASCII     使用7位,能表示 2^7,128个字符,一字节的最高位总是0

2. ISO8859-1      兼容 ASCII ,使用8位,表示256个字符

3. GB2312  GBK   GB18030   兼容 ISO8859-1,能表示汉字

4. Unicode    统一两个字节表示一个字符

5. UTF-8      兼容 ISO8859-1,可以看做是Unicode的实现

编码解码要一致,否则会有乱码

 windows 默认 GBK,Linux 默认 UTF-8

python 默认 Unicode

在 windows 上操作文件,系统使用 GBK 编码,所以解码也需要使用 GBK

# write 写入字符串,writelines 写入字符串列表
f = open(r'a.txt', "a", encoding="UTF-8")
f.write('爱我中华')
f.writelines(["爱\n", "我\n", "中\n", "华\n"])
f.close()

# encoding 告诉操作系统建一个以 UTF-8 编码的文件,这样中文文件打开就不会有乱码
# 如果没有,打开文件后乱码,需要改变 file encoding 就可以正常显示

# 文件内表现形式

#################################################
爱我中华爱
我
中
华
#################################################

close() 关闭文件

# 使用异常机制,解决写入过程中发生错误,导致文件无法关闭的情况
# 异常机制,跳过错误,完成写操作
try:
    f = open(r"a.txt", "a")
    str = "dada"
    f.write(str)
except BaseException as e:
    print(e)
finally:
    f.close()

with 上下文管理器

a = 'asdasd'
with open(r'a.txt', "a") as f:
    f.write(a)

不用特地去关闭文件

文件的读取

读取方式

# 文件名.读取方式
with open(r"a.txt", "r", encoding="UTF-8") as f:
    a = f.read()        # 读取所有内容

with open(r"a.txt", "r", encoding="UTF-8") as f:
    b = f.read(3)       # 读取前三个字符

with open(r"a.txt", "r", encoding="UTF-8") as f:
    c = f.readline()    # 读取第一行
                        # 如果读取到文件末尾,会返回一个空字符串,按行读取会用到

with open(r"a.txt", "r", encoding="UTF-8") as f:
    d = f.readlines()    # 每一行作为字符串存入列表

按行读取(两种)

# 第一种
with open(r"a.txt", "r", encoding="UTF-8") as f:
    while True:
        fragment = f.readline()
        if not fragment:
            break
        else:
            print(fragment, end="")

# 第二种
with open(r"a.txt", "r", encoding="UTF-8") as f:
    for a in f:
        print(a, end="")

enumerate() 的使用

a = ["001", "002", "003"]
b = enumerate(a)
c = list(b)
print(c)

d = [temp + '#' + str(index) + "\n" for index, temp in c]
print(d)

################################################################
[(0, '001'), (1, '002'), (2, '003')]
['001#0\n', '002#1\n', '003#2\n']
################################################################

二进制文件的读写

要在模式中增加 b

注意:打开二进制文件不能添加编码,即不能加 encoding = "...",否则报错

拷贝

with open(r"a.gif", "rb") as f:
    with open(r"aa.gif", "wb") as w:
        for line in f.readlines():
            w.write(line)
print("copy done")

文件基本操作

seek

用来控制当前指针位置,seek是按字节读取的,汉字一般3个字节

with open(r"a.txt", "r", encoding="utf-8") as f:
    print("文件名是:{0}".format(f.name))
    print("读取前指针位置:{0}".format(f.tell()))
    print("文本内容:{0}".format(f.read()))
    print("读取后指针位置:{0}".format(f.tell()))
    f.seek(12, 0)
    print("移动后指针位置:{0}".format(f.tell()))
    print(f.read())

########################################################
文件名是:a.txt
读取前指针位置:0
文本内容:爱我中华爱我家
读取后指针位置:21
移动后指针位置:12
爱我家
########################################################

seek( 偏移量 [, 起始位置] )

偏移量:偏移量为正数,代表从起始位置向文件末尾偏移;偏移量为负数,代表从起始位置向文件起点偏移

起始位置: 0 代表从头开始(可以省略不写!)

                   1 代表从当前位置开始

                   2 从文件末尾开始

注意:在文本文件中,没有使用 b 模式选项打开的文件,只允许从文件头开始计算相对位置,从其他两个位置都会报错

只有使用 b 模式打开才可以让起始位置在当前或文件末尾,也就是只能用 0

序列化与反序列化

内存中的数据存入硬盘,称为序列化

从硬盘中取出读入内存,称为反序列化

网络中传播也可以这么理解

import pickle            # 导入模块
a1 = "Lu"
a2 = 111
a3 = [1, 2, 3]
with open("a.txt", "wb") as f:   
    pickle.dump(a1, f)          # 序列化
    pickle.dump(a2, f)
    pickle.dump(a3, f)

with open("a.txt", "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))

###############################################
Lu
111
[1, 2, 3]
9871232
10022176
###############################################

CSV文件操作

CSV使逗号分隔符文本格式

值没有类型,都是字符串;不能指定字体样式;不能指定单元格宽高与合并;没有多个工作表;不能嵌入图像图表

读取和写入

import csv

with open(r"a.csv", "r") as f:        # 第一种遍历方式
    a_csv = csv.reader(f)
    for row in a_csv:
        print(row)

with open(r"a.csv", "r") as f:        # 第二种
    a_csv = csv.reader(f)
    print(list(a_csv))

####################################
['姓名', '年龄', '城市']
['aaa', '16', 'A']
['bbb', '17', 'B']
['ccc', '18', 'C']
[['姓名', '年龄', '城市'], ['aaa', '16', 'A'], ['bbb', '17', 'B'], ['ccc', '18', 'C']]
####################################
import csv

with open(r"a.csv", "w") as f:
    a_csv = csv.writer(f)
    a_csv.writerow(['ddd', '19', 'D'])
   
    b = [['eee', '20', 'E'], ['fff', '21', 'F'], ['ggg', '22', 'G']]
    a_csv.writerows(b)

OS模块

调用操作系统可执行文件

import os
os.system("notepad.exe")   # 记事本
os.system("regedit")       # 注册表
os.system("ping www.baidu.com")   # 查看网络交互状态
os.system("cmd")           # 命令行

os.startfile(r"a.exe")    # 调用可执行文件

文件和目录操作

import os

#########获取文件与文件夹信息
print(os.name)   # 操作系统名称
print(os.sep)
print(repr(os.linesep))

print(os.stat("test3.py"))    # 文件信息


#########关于工作目录操作
print(os.getcwd())    # 当前工作目录
os.mkdir("aaa")       # 在工作目录下穿件新的目录
os.chdir("d:")        # 改变工作目录至D盘

#########创建目录,创建多级目录,删除
os.rmdir("dadas")     # 删除目录
os.makedirs("dad/dasd/das")    # 创建多级目录
os.removedirs("dad/dasd/das")  # 删除多级目录
os.makedirs("../ada/dad/ada")  # 在上级目录下新建多级目录
os.rename("aaa", "bbb")        # 把aaa改名为bbb
os.listdir("aaa")              # 返回aaa目录下的一级子目录

os.path模块

使用说明:传送门

walk

 遍历子目录子文键,返回一个三个元素的元组,路径,所有的目录,所有的文件

import os

all_files = []
path = os.getcwd()
list_files = os.walk(path)

for dirpath, dirnames, filenames in list_files:
    for dir in dirnames:
        all_files.append(os.path.join(dirpath, dir))
    for file in filenames:
        all_files.append(os.path.join(dirpath, file))

for file in all_files:
    print(file)

shutil 模块(拷贝与压缩)

import shutil
import zipfile

# copy
shutil.copyfile("source.txt", "goal.txt")

shutil.copytree("aa/dd", "cc")

# 压缩、解压缩
shutil.make_archive("bb/cc", "zip", "aa")    # 把 aa 这个文件压缩到 bb 下命名为 cc

z1 = zipfile.ZipFile("a.zip", "w")
z1.write("aa.txt")
z1.write("bb.txt")
z1.close()

z2 = zipfile.ZipFile("a.zip", "r")
z2.extractall("aaa")
z2.close()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值