file文件操作相关的模块 文件的写入和读取 with上下文管理器

**

1,文件的分类

**在这里插入图片描述
**

2,文件操作相关模块概述

**
在这里插入图片描述
**

3,创建文件对象open()

**
1,open()用于创建文件对象

2,语法格式为 open(文件名[,打开方式])

3,为了减少“\”的输入,可以使用原始字符串:r“d:\b.txt”。
例如:f = open(r"d:\b.txt",“w”)

在这里插入图片描述
**

4,文件的写入

**
文件的写入一般包含如下三个步骤:
1,创建文件对象
2, 写入数据
3,关闭文件对象

f = open("666.txt", "a", encoding="utf-8")
f.write("王皮皮\n淘气不淘气")
f.close()

运行结果为:
在这里插入图片描述
1,write()/writelines()写入数据

2,
write(a):把字符串 a 写入到文件中
writelines(b):把字符串列表写入文件中,不添加换行符

f = open(r"e:\bb.txt", "w", encoding="utf-8")
s = ["王小皮\n", "王二皮\n", "王大皮\n"]
f.writelines(s)
f.close()

运行结果如下:
在这里插入图片描述

**

5,常用编码介绍

**
在这里插入图片描述
1,GB18030 现在最新的内码字集于 2000 年发布,并于 2001 年强制执行,包含了中国大部分少数 民族的语言字符,收录汉字数超过 70000 余个。

2,它主要采用单字节、双字节、四字节对字符编码,它是向下兼容 GB2312 和 GBK 的, 虽然是我国的强制使用标准,但在实际生产中很少用到,用得最多的反而是 GBK 和 GB2312

3,对于英文字母,unicode 也需要两个字节来表示。所以 unicode 不便 于传输和存储。因此而产生了 UTF 编码,UTF-8 全称是(8-bit Unicode Transformation Format)。

4,UTF 编码兼容 iso8859-1 编码,同时也可以用来表示所有语言的字符, 不过,UTF 编码是不定长编码,每一个字符的长度从 1-4 个字节不等。其中, 英文字母都是用一个字节表示,而汉字使用三个字节。

5,一般项目都会使用 UTF-8。unicode 中虽然汉字是两个字节, UTF-8 中汉字是 3 个字节。但是互联网中一个网页也包含了大量的英文字母, 这些英文字母只占用 1 个字节,整体占用空间,UTF-8 仍然由于 Unicode。

6,中文乱码问题
windows 操作系统默认的编码是 GBK,Linux 操作系统默认的编码是 UTF-8。
当我们 用 open()时,调用的是操作系统打开的文件,默认的编码是 GBK。

**

6,close()关闭文件流

**
在这里插入图片描述

try:
    f = open(r"1.txt", "a", encoding="utf-8")
    f.write("我叫王皮皮")
except BaseException as e:
    print(e.args)
finally:
    f.close()

**

7,with语句 上下文管理器

**
1,finally块由于是否发生异常都会执行,通常是我们释放资源的代码。
可通过with上下文管理,更方便的实现释放资源的操作

2,语法结构如下:
with context_expr[as war]
语句块

3,with上下文管理可以自动管理资源,在with代码块执行完毕后自动还原进入该代码之前的现场或上下文。
不论何种原因跳出with块,不论是否有异常,总能确保文件正确的关闭保证资源正常释放。
在文件操作,网络通信相关的场合非常常用

with open("C:\\Users\\toby5\\Desktop\\李笑 机试\\abc.txt", "w", encoding='utf-8') as f:
    f.write("abc456")
    f.close()
s = ["王\n", "皮皮\n", "王皮皮\n"]
with open(r"2.txt", "a", encoding="utf-8") as f:
    f.writelines(s)
    f.close()

运行结果为:

王
皮皮
王皮皮

**

8,文本文件的读取

**


1,read([size]) 从文件中读取 size 个字符,并作为结果返回。
	如果没有 size 参数,则读取整个文件。 读取到文件末尾,会返回空字符串。

2,readline() 读取一行内容作为结果返回。读取到文件末尾,会返回空字符串。

3,readlines() 文本文件中,每一行作为一个字符串存入列表中,返回该列表

# 读取一个文件前 4 个字符
with open(r"2.txt", "r", encoding="utf-8") as f:
    print(f.read(3))

# 文件较小,一次将文件内容读入到程序中
with open(r"2.txt", "r", encoding="utf-8") as f:
    print(f.read())

# 按行读取一个文件
with open(r"666.txt", "r", encoding="utf-8") as f:
    while True:
        fragment = f.readline()
        if not fragment:
            break
        else:
            print(fragment, end="")

# 使用迭代器(每次返回一行)读取文本文件
with open(r"666.txt", "r", encoding="utf-8") as f:
    for i in f:
        print(i, end="")


**

9,用enumerate()函数和列表推导式为文本文件增加行号

**
1,在文件的右边增加行号

with open(r"666.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()
    c = [line.rstrip() + " #" + str(index + 1) + "\n" for index, line in enumerate(lines)]

with open("666.txt","w",encoding="utf-8") as f:
    f.writelines(c)

运行结果为:

王皮皮 #1
淘气不淘气 #2
嘿嘿 #3
哈哈 #4
呵呵 #5

2,在文件的左边增加行号

with open(r"666.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()
    c = ["#" + str(index+1)+line.lstrip()+"\n" for index, line in enumerate(lines)]

with open("666.txt","w",encoding="utf-8") as f:
    f.writelines(c)

**

10,二进制文件的读取和写入

**
1,二进制文件的处理流程和文本文件流程一致。首先还是要创建文件对象,不过,我们需要指 定二进制模式,从而创建出二进制文件对象。

2,例如 f = open(r"d:\a.txt", ‘wb’) #可写的、重写模式的二进制文件对象

3,例如 f = open(r"d:\a.txt", ‘ab’) #可写的、追加模式的二进制文件对象

4,例如 f = open(r"d:\a.txt", ‘rb’) #可读的二进制文件对象

5,创建好二进制文件对象后,仍然可以使用 write()、read()实现文件的读写操作。

with open('aa.jpg', 'rb') as f:
    with open('aa_copy.jpg', 'wb') as w:
        for line in f.readlines():
            w.write(line)

print('图片拷贝完成!')

**

11,文件对象的常用属性和方法

**
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
**

12,文件任意位置操作

**

# seek() 移动文件指针示例

with open(r"666.txt", "r", encoding="utf-8") as f:
    print("文件名是", format(f.name))
    print(f.tell())
    print("读取的内容是", format(str(f.readline())))
    print(f.tell())
    print("读取的内容是", format(str(f.readline())))
    f.seek(0, 0)
    print("读取的内容是", format(str(f.readline())))

运行结果为:

文件名是 666.txt
0
读取的内容是 #1王皮皮

13
读取的内容是 #2淘气不淘气

读取的内容是 #1王皮皮

**

13,使用 pickle 序列化

**
1,Python 中,一切皆对象,对象本质上就是一个“存储数据的内存块”。有时候,我们 需要将“内存块的数据”保存到硬盘上,或者通过网络传输到其他的计算机上。这时候,就 需要“对象的序列化和反序列化”。 对象的序列化机制广泛的应用在分布式、并行系统上。

2,序列化指的是:将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他 地方。

3,反序列化是指相反的过程,将读取到的“串行化数据”转化成对象。

4,可以使用 pickle 模块中的函数,实现序列化和反序列操作。

5,pickle.dump(obj, file) obj 就是要被序列化的对象,file 指的是存储的文件

6,pickle.load(file) 从 file 读取数据,反序列化成对象

将对象序列化到文件中

import pickle
with open(r"bb.txt", "wb") as f:
    a1 = "皮皮"
    a2 = 123
    a3 = [1, 2, 3]
    pickle.dump(a1, f)
    pickle.dump(a2, f)
    pickle.dump(a3, f)

将获得的数据反序列化成对象

import pickle
with open(r"bb.txt", "rb") as f:
    a1 = pickle.load(f)
    a2 = pickle.load(f)
    a3 = pickle.load(f)
    print(a1)
    print(a2)
    print(a3)

**

14, CSV 文件的操作

**

1,csv(Comma Separated Values)是逗号分隔符文本格式,常用于数据交换、Excel 文件和数据库数据的导入和导出。

2,与 Excel 文件不同,CSV 文件中:
		值没有类型,所有值都是字符串 
		不能指定字体颜色等样式 
		不能指定单元格的宽高,不能合并单元格
		没有多个工作表 
		不能嵌入图像图表
		
3,Python 标准库的模块 csv 提供了读取和写入 csv 格式文件的对象。

在这里插入图片描述
csv.reader 对象和 csv 文件读取

import csv
with open(r"5.csv", "r") as f:
    # 创建csv对象,它是一个包含所有数据的列表,每一行为一个元素
    f_csv = csv.reader(f)
    # print(list(f_csv))

    # 获得列表对象,包含标题行的信息
    headers = next(f_csv)
    print(headers)

    # 循环打印各行内容
    for row in f_csv:
        print(row)

运行结果为:

['姓名', '年龄', '爱好', '零花钱']
['王皮', '3', '吃饭', '15']
['王小皮', '4', '睡觉', '20']
['王皮皮', '5', '打豆豆', '35']

csv.writer 对象和 csv 文件写入

import csv
headers = ["工号","姓名","年龄","地址","月薪"]
rows = [("1","王老大",18,"1号院","500"),("2","王老二",19,"2号院","300")]
with open(r"5.csv","a") as b:
    b_csv = csv.writer(b)  # 创建csv对象
    b_csv.writerow(headers)  # 写入一行标题
    b_csv.writerows(rows)  # 写入多行数据

**

15,os 模块

**
1,os 模块可以帮助我们直接对操作系统进行操作。

2,我们可以直接调用操作系统的可执行 文件、命令,直接操作文件、目录等等。是系统运维的核心基础。

3,os.system 是可以帮助我们直接调用系统的命令

4,os.system 调用 windows 系统的记事本程序

import os
os.system("notepad.exe")

5,os.system 调用 windows 系统中 ping 命令

import os
os.system("ping www.baidu.com")

6,注意控制台输出中文可能会有乱码问题,可以在 file–>setting 中设置

7,Linux 是命令行操作更容易,我们可以通过 os.system 可以更加容易的调用相关的命 令;

8,os.startfile:直接调用可执行文件

9,运行安装好的微信

import os
os.startfile(r"C:\Program Files (x86)\Tencent\WeChat\WeChat.exe")

**

16,os模块之文件和目录操作

**
在这里插入图片描述
在这里插入图片描述

import os
print(os.name)  # windows系统返回的是nt linux和unix-->posix
print(os.sep)  # windows--->\   linux和unix---->/
print(repr(os.linesep))  # windows--->\r\n   linux--->\n\
print(os.stat("1.py"))  # 获取文件的相关信息
print(os.getcwd())  # 返回当前工作目录

运行结果为:

nt
\
'\r\n'
os.stat_result(st_mode=33206, st_ino=744219838423106336, st_dev=200608462, st_nlink=1, st_uid=0, st_gid=0, st_size=358, st_atime=1562929590, st_mtime=1562929590, st_ctime=1562923376)
E:\06_面向对象
import os
print(os.getcwd())
os.chdir("e:")  # 改变当前的工作目录为E盘根目录
os.mkdir("书籍") # E盘根目录下创建一个名为 书籍的 目录
import os
os.mkdir("书籍")  # 相对路径是相对于当前的工作目录
os.rmdir("书籍")  # 删除当前工作空间下的书籍目录

# 创建多级目录
os.makedirs("电影/港台/周星驰")
os.removedirs("电影/港台/周星驰")  # 只能删除空目录

# 在上级目录下,创建多级目录
os.makedirs("../音乐/香港/刘德华")  # ../指的是上一级目录

os.rename("电影","movie")

dirs = os.listdir("movie")
print(dirs)

**

17,os.path 模块

**
在这里插入图片描述

import os
import os.path
print(os.path.isabs("d:/a.txt"))  # 是否绝对路径 True
print(os.path.isdir("d:/a.txt"))  # 是否目录 False
print(os.path.isfile("d:/a.txt"))  # 是否文件 
print(os.path.exists("a.txt"))  # 文件是否存在

print(os.path.getsize("a.txt"))  # 文件大小
print(os.path.abspath("a.txt"))  # 输出绝对路径
print(os.path.dirname("d:/a.txt"))  # 输出所在目录

print(os.path.getctime("a.txt"))  # 返回创建时间
print(os.path.getatime("a.txt"))  # 返回最后访问时间
print(os.path.getmtime("a.txt"))  # 返回最后修改时间

path = os.path.abspath("a.txt")  # 返回绝对路径
print(os.path.split(path))  # 返回元组:目录、文件
# ('C:\\Users\\Administrator\\PycharmProjects\\mypro_io\\test_os', 'a.txt')

print(os.path.splitext(path)) #返回元组:路径、扩展名
# ('C:\\Users\\Administrator\\PycharmProjects\\mypro_io\\test_os\\a', '.txt')

print(os.path.join("aa","bb","cc")) #返回路径:aa/bb/cc

需求:列出指定目录下所有的.py 文件,并输出文件名


import os
path = os.getcwd()
file_list = os.listdir(path)  # 列出子目录和子文件 是一个列表,可进行循环遍历
for filename in file_list:
    if filename.endswith("py"):
        print(filename, end="\t")

另一种写法为:

import os
path = os.getcwd()

file_list2 =[filename for filename in os.listdir(path) if filename.endswith("py")]
for filename in file_list2:
    print(filename, end="\t")

**

18,os.walk()递归遍历所有文件和目录

**

1,os.walk()方法:
	返回一个 3 个元素的元组,(dirpath, dirnames, filenames),
	dirpath:要列出指定目录的路径
	dirnames:目录下的所有文件夹
	filenames:目录下的所有文件

需求:os.walk()递归遍历所有的子目录和子文件

import os
path = os.getcwd()
list_files = os.walk(path)
for dirpath,dirnames,filenames in list_files:
    for dir in dirnames:
        print(os.path.join(dirpath,dir))
    for file in filenames:
        print(os.path.join(dirpath,file))

另一种写法是:

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)

**

19,shutil 模块(拷贝和压缩)

**
1,shutil 模块是 python 标准库中提供的,主要用来做文件和文件夹的拷贝、移动、删除等;还可以做 文件和文件夹的压缩、解压缩操作。

2,os 模块提供了对目录或文件的一般操作。shutil 模块作为补充,提供了移动、复制、压缩、解压等操 作,这些 os 模块都没有提供。

3,实现文件的拷贝

import shutil
#copy 文件内容
shutil.copyfile("1.txt","1_copy.txt")

4,实现递归的拷贝文件夹内容(使用 shutil 模块)

import shutil

#"音乐"文件夹不存在才能用
# 将文件夹“电影/学习”下面的内容拷贝到文件夹“音乐”下。拷贝时忽略所有的 html 和 htm 文件。
shutil.copytree("电影/学习","音乐 ",ignore=shutil.ignore_patterns("*.html", "*.htm"))

**

20,shutil和zipfile模块实现压缩和解压

**

import shutil
import zipfile

# 将"电影/学习"文件夹下所有内容压缩到"音乐2"文件夹下生成 movie.zip
shutil.make_archive("音乐2/movie","zip","电影/学习")

# 压缩:将指定的多个文件压缩到一个 zip 文件
z = zipfile.ZipFile("a.zip","w")
z.write("1.txt")
z.write("2.txt")
z.close()

# 实现将压缩包解压缩到指定文件夹(使用 shutil 模块)
import shutil
import zipfile
z2 = zipfile.ZipFile("a.zip","r")
z2.extractall("d:/")  # 设置解压的地址
z2.close()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值