本文介绍如何使用Python实现对文件、目录以及压缩包的操作。
一、文件操作
1、创建文件
with open("example.txt", "w") as file:
# 在这里进行文件操作
pass
2、删除文件
如果文件不存在,将会抛出文件不存在的异常。注意只能删文件,如果给了一个文件夹路径则会报错。
import os
try:
os.remove('example.txt')
print('文件删除成功')
except Exception as e:
print('文件删除失败', e)
3、拷贝文件
import shutil
shutil.copy('example.txt','./new_folder')
shutil.copy('example.txt','./new_folder/new_file.txt')
两种实现方案:
- 第二个参数写某个文件夹位置,则复制到该文件夹下;
- 第二个参数写文件路径,复制到这个路径并且重命名。
4、移动文件
import shutil
shutil.copy('example.txt','./new_folder/')
shutil.move('example.txt','new_folder/new_file.txt')
两种方式使用:
- 第二个参数是文件夹位置,则移动到文件夹下面
- 第二个参数是文件路径,移动到这个路径并且重命名
注意:如果是文件夹后面一定要加'/'
。
5、重命名文件
import os
os.rename('old_file.txt','new_file.txt')
6、查询文件
(1)字符串内置方法
.startswith()
,.endswith()
(2)glob模块
import glob
print(glob.glob('*.py'))
print(glob.glob('**/*.txt',recursive=True))
模式 | 意义 |
---|---|
* | 匹配所有 |
? | 匹配任何单个字符 |
[seq] | 匹配seq中的任何字符 |
[!seq] | 匹配任何不在seq中的字符 |
用
**
表示任意层文件或文件夹 recursive=True会不断进入文件夹内
7、打印文件信息
import os
for file in os.scandir('./'):
print(file.stat())
os.scandir()
返回的文件都可以查询信息
- st_size: 文件的体积大小(单位:bytes),除以10024就是KB
- st_atime: 文件的最近访问时间
- st_mtime:文件的最近修改时间
- st_ctime:Windows下表示创建时间
- st_birthtime:只在Mac、Linux下可用,表示创建时间
8、读文件
(1)read()方法
read()方法用于读取整个文件的内容,并将其存储为一个字符串。
file = open('example.txt', 'r')
content = file.read()
print(content)
(2)readlines()方法
readlines()方法用于读取整个文件的内容,并将其存储为一个列表,列表中的每个元素表示文件中的一行。
file = open('example.txt', 'r')
lines = file.readlines()
for line in lines:
print(line)
(3) readline()方法
readline()方法用于读取文件的一行内容,并将其存储为一个字符串。
file = open('example.txt', 'r')
line = file.readline()
print(line)
4、写文件
文件读写模式:
打开模式 | 文件类型 | 方式 | 对已有文件影响 | 如果文件不存在 | 备注 |
---|---|---|---|---|---|
r | 文本 | 只读 | 无 | 抛异常 | write等方法不可用 |
rb | 二进制 | 只读 | 无 | 抛异常 | write等方法不可用 |
r+ | 文本 | 读写 | 追加 | 抛异常 | 无 |
rb+ | 二进制 | 读写 | 追加 | 抛异常 | 无 |
w | 文本 | 只写 | 覆盖并新建 | 新建 | read等方法不可用 |
wb | 二进制 | 只写 | 覆盖并新建 | 新建 | read等方法不可用 |
w+ | 文本 | 读写 | 覆盖并新建 | 新建 | 因为覆盖原来文件,read等方法获取到原文件的内容 |
wb+ | 二进制 | 读写 | 覆盖并新建 | 新建 | 因为覆盖原来文件,read等方法获取到原文件的内容 |
a | 文本 | 追加 | 追加到最后 | 新建 | read等方法不可用 |
ab | 二进制 | 追加 | 追加到最后 | 新建 | read等方法不可用 |
a+ | 文本 | 读写 | 追加到最后 | 新建 | 无 |
ab+ | 二进制 | 读写 | 追加到最后 | 新建 | 无 |
(1)写入字符串数据
# 写入字符串数据
with open("example.txt", "w") as file:
file.write("Hello, World!\n")
file.write("This is a new line.")
(3)写入字节数据
- 使用
write()
方法将字节数据写入文件。 - 可以使用
encode()
方法将字符串转换为字节数据进行写入。
# 写入字节数据
with open("example.txt", "wb") as file:
content = "Hello, World!\n"
file.write(content.encode("utf-8"))
(4)writelines()
写入list内容,不会在元素之间自动添加换行符。
with open('example.txt','w',encoding='utf-8') as f:
lines = [
'春夜喜雨\n',
'杜甫 [唐代]\n',
'好雨知时节,当春乃发生。\n',
'随风潜入夜,润物细无声。\n',
'野径云俱黑,江船火独明。\n',
'晓看红湿处,花重锦官城。\n']
f.writelines(lines)
二、目录操作
1、遍历文件夹
(1)列出当前文件夹下所有的文件和文件夹
import os
os.listdir()
os.listdir('指定目录')
for file in os.scandir():
print(file.name, file.is_dir())
判断文件还是文件夹:
import os
os.path.isdir('example')
os.path.isfile('example')
(2)遍历目录下所有的文件
import os
for dirpath, dirnames, files in os.walk('./'):
print(f'发现文件夹:{dirpath}')
print(files)
dirpath 是文件夹路径; dirnames是dirpath这个文件夹下的子文件夹列表; files是dirpath这个文件夹里的文件列表。
2、创建文件夹
(1)创建单层文件夹
import os
os.mkdir('新文件夹')
放文件夹已经存在时运行这句代码会报错,FileExisitsError
。
import os
if not os.path.exists('新文件夹'):
os.mkdir('新文件夹')
只有当文件夹不存在的时候创建文件夹。
(2)创建多层文件夹
import os
os.makedirs('第一层文件夹/第二层文件夹/第三层文件夹')
当最里层文件夹已经存在时(第三层)运行这句代码会报错。
3、删除文件夹
import shutil
shutil.rmtree('文件夹')
4、复制文件夹
import shutil
shutil.copytree('文件夹1','文件夹2')
会将文件夹内的所有文件和文件夹都复制过去,新的文件夹不能已经存在。
5、移动文件夹
shutil.move(要移动的文件/文件夹,要移动的位置)
import shutil
shutil.move('folder_1','new_folder/')
shutil.move('folder_2','new_folder')
两种方式使用:
- 第二个参数是文件夹位置,则移动到文件夹下面
- 第二个参数是文件路径,移动到这个路径并且重命名
注意:如果是文件夹后面一定要加'/'
。
6、重命名文件夹
import os
os.rename('old_folder','new_folder')
7、查找文件夹
字符串内置方法:.startswith()
,.endswith()
8、路径拼接(解决跨平台问题)
Windows中采用反斜杠()作为作为文件夹之间的分隔符; Mac和Linux中采用正斜杠(/)作为文件夹之间的分割符。
为了解决跨平台的不一致,使用os模块下的系统函数进行拼接:
import os
os.path.join('MyApp', 'service')
Windows:
MyApp\\service
, Mac和LinuxMyApp/service
三、压缩文件
1、读取压缩文件
import zipfile
with zipfile.ZipFile('压缩包.zip','r') as zipobj:
print(zipobj.namelist())
乱码情况处理:
for file_name in zipodj.namelist():
print(file_name.encode('cp437').decode('gbk'))
2、获取压缩包文件信息
import zipfile
with zipfile.ZipFile('压缩包.zip','r') as zipobj:
for file_name in zipobj.namelist():
info = zipobj.getinfo(file_name)
print(info.file_size,info.compress_size)
file_size
是原始文件的大小,compress_size
是压缩后大小,输出单位为字节。
3、解压压缩包
zipobj.extract(压缩包要解压的文件名,解压到的位置)
import zipfile
with zipfile.ZipFile('压缩包.zip','r') as zipobj:
zipobj.extract('压缩包内压缩的文件名','解压到的指定目录')
中文名字解压后会出现乱码 乱码解决:
for file_name in zipobj.namelist():
correct_path = file_name.encode('cp437').decode('gbk')
建议路径中文件和文件夹不要出现中文。 如果有中文可以现货区正确的编码文字,再重命名。
4、提取压缩包文件
默认当前路径:
import zipfile
with zipfile.Zipfile('压缩包.zip','r') as zipobj:
zipobj.extractall()
带密码的压缩文件解压:
import zipfile
with zipfile.Zipfile('压缩包.zip','r') as zipobj:
zipobj.extractall(path='指定解压目录',pwd=b'设置的密码')
5、创建压缩包
import zipfile
file_list = ['1.txt','2.txt','3.txt']
with zipfile.ZipFile('压缩成的压缩包名称.zip','w') as zipobj:
for file in file_list:
zipobj.write(file)
mode='a' 表示追加。
网友评论