文件的常用操作
Path相关操作,主要为文件属性,路径目录等
点击查看代码
def _Path():
from pathlib import Path
import shutil
# 创建 Path 对象
print(Path().absolute())
p = Path("data/example.txt")
p1 = Path("data/dir")
# Path("data") / "data1" /Path("data2.txt") 拼接路径,字符串和Path对象也可以直接这样拼接
# p.resolve(),通过传入文件名,返回文件的完整路径。
# p.name,可以获取文件的名字,包含后缀名。
# p.parent,返回文件所在文件夹的名字。
# p.stem,获取文件名不包含后缀名。
# p.suffix,获取文件的后缀名。
# p.anchor,获取文件所在的盘符。
# p.stat().st_mtime,获取文件大小
# p.as_posix() 路径统一为正斜杠,建议任何时候都转换为这种
print(p.resolve())
# 检查路径
if p.exists():
if p.is_file():
print(f"{p} 是一个存在的文件")
if p.is_dir():
print(f"{p} 是一个存在的路径文件夹")
else:
# 创建目录
Path("data/dir").mkdir(parents=True,exist_ok=True)
# 创建文件,创建的是空文件所以只有几种可以文本文件 (.txt, .log, .md, .py),csv文件,html可以,其他的excel,图像文件,压缩包,等都不行,
p.touch(parents=True,exist_ok=True)
# 删除文件
p.unlink(missing_ok=True)
# 删除非空目录,Path无法做到,需要用shutil
shutil.rmtree(p1)
# 删除空目录
p1.rmdir()
# 遍历当前目录
for file in Path("data").iterdir():
print('file',file)
if file.is_file():
print(f"文件: {file.name}")
# 递归遍历
for item in Path("data").rglob("*"):
if item.is_dir():
print(f'文件夹:{item.name}/')
else:
# 分割路径,可以筛选是否需要的目录,例如只想在二级目录筛选则换成path_parts[1]即可
path_parts = item.parts
if '7.Tutorial' in path_parts:
continue
# 定义原文件和新文件路径
old_file = Path("old_name.txt")
new_file = Path("new_name.txt")
# 执行重命名,需要注意目录重命名会连带其所有子文件和子目录一起更名,谨慎重命名不是最下级的目录
old_file.rename(new_file)
文件读取写入的相关操作
点击查看代码
def _file():
import json
# 文本模式
'r' # 只读(默认)
'w' # 写入(覆盖)
'a' # 追加
'x' # 独占创建(文件存在则报错)
'r+' # 读写
'w+' # 读写(覆盖)
'a+' # 读写(追加)
'b' # 二进制模式标志(与其他模式组合)
# 二进制模式
'rb' # 二进制只读
'wb' # 二进制写入
'ab' # 二进制追加
'xb' # 二进制独占创建
'r+b' # 二进制读写
'w+b' # 二进制读写(覆盖)
'a+b' # 二进制读写(追加)
# 方法1: read() - 读取全部内容
with open('text_file.txt', 'r', encoding='utf-8', errors="ignore") as file:
content = file.read()
print(content)
# 方法3: readlines() - 读取所有行到列表
with open('text_file.txt', 'r', encoding='utf-8') as file:
lines = file.readlines()
for i, line in enumerate(lines, 1):
print(f"第{i}行: {line}", end='')
# 方法4: 逐行迭代(内存友好)
with open('text_file.txt', 'r', encoding='utf-8') as file:
for line_number, line in enumerate(file, 1):
print(f"第{line_number}行: {line}", end='')
# 方法5: 读取指定字节数
with open('text_file.txt', 'r', encoding='utf-8') as file:
chunk = file.read(100) # 读取前100个字符
print(chunk)
# 方法1: write() - 写入字符串
with open('output.txt', 'w', encoding='utf-8') as file:
file.write('第一行内容\n')
file.write('第二行内容\n')
file.write('第三行内容')
# 方法2: writelines() - 写入字符串列表
lines = ['第一行\n', '第二行\n', '第三行\n']
with open('output.txt', 'w', encoding='utf-8') as file:
file.writelines(lines)
# 方法3: 高效写入多行
data = ['苹果', '香蕉', '橙子', '葡萄']
with open('fruits.txt', 'w', encoding='utf-8') as file:
file.write('\n'.join(data))
# 方法4: 追加写入
with open('log.txt', 'a', encoding='utf-8') as file:
file.write('2024-01-01 10:00:00 - 程序启动\n')
file.write('2024-01-01 10:05:00 - 处理完成\n')
# 网络上下载二进制对象
res = requests.get(
url='url',
)
with open('test2.jpg', 'wb') as file:
file.write(res.content)
# 读取二进制对象并写入新对象
with open('apple.png', 'rb') as src_file:
with open('apple1.png', 'wb') as dst_file:
# 方法1: 一次性复制(小文件)
# dst_file.write(src_file.read())
# 方法2: 分块复制(大文件推荐)
while True:
chunk = src_file.read(8192)
if not chunk:
break
dst_file.write(chunk)
import mimetypes
# 获取文件类型,image/png
mime_type, _ = mimetypes.guess_type('apple.png')
def encode_image(image_path):
# 获取文件的base64,常用来上传网络的都会转成base64编码
import base64
with open('apple.png', "rb") as image_file:
return base64.b64encode(image_file.read()).decode("utf-8")
# 读取JSON文件
def read_json_file(file_path):
"""读取JSON文件"""
with open(file_path, 'r', encoding='utf-8') as file:
data = json.load(file)
return data
# 写入JSON文件
def write_json_file(file_path, data, indent=2):
"""写入JSON文件"""
with open(file_path, 'w', encoding='utf-8') as file:
json.dump(data, file, ensure_ascii=False, indent=indent)
# 漂亮的JSON输出
def write_pretty_json(file_path, data):
"""写入格式化的JSON"""
with open(file_path, 'w', encoding='utf-8') as file:
json.dump(data, file, ensure_ascii=False, indent=2, sort_keys=True)
使用pd操作excel
点击查看代码
def _excel():
# 一般用来做数据,使用pd即可
import pandas as pd
# 带数据的建表,index为序号可以不加
pd.DataFrame([{'种类':'狗','颜色':'黑'},{'种类':'猫','颜色':'白'}]).to_excel('统计.xlsx',sheet_name='动物',index=False)
# 不带数据建表,数据为空即可
pd.DataFrame().to_excel('统计.xlsx',index=False)
# 若是需要空单元格,把值改为float或None即可,{'种类':'狗','颜色':float('nan')},{'种类':'狗','颜色':None}
# 可以把nan替换成更常用的None或其他想要填充的值
pd.read_excel('统计.xlsx').fillna(None)
# 追加数据
with pd.ExcelWriter('统计.xlsx', mode='a', engine='openpyxl', if_sheet_exists='overlay') as writer:
startrow = pd.read_excel('统计.xlsx', sheet_name='sheet1').shape[0] + 1
pd.DataFrame(a).to_excel(writer, sheet_name='sheet1',startrow=startrow,header=False, index=False)
# 读取数据
# axis,0为行,1为列,how,all全部为nan,any,任意一个单元格为nan,则忽略这行,sheet_name默认为第一个sheet,int代表第几个,str代表名字是哪个,list['sheet1','sheet2']代表多个,None代表所有
# 若是多个sheet就需要迭代,sheet为None和list
all_df = pd.read_excel('统计.xlsx',sheet_name=None)
for name, df in all_df.items():
print(df.dropna(axis=0, how='all').to_dict())
df = pd.read_excel('统计.xlsx',sheet_name=0).dropna(axis=0, how='all')
# 忽略名字为测试截图的列
df = df.drop(columns=df.filter(like='测试截图').columns.tolist())
orientations = {
'records': '列表字典格式,每条记录是一个字典',
'dict': '列字典格式,列名为键,值为该列的数据',
'list': '列字典格式,但值是列表形式',
'series': '类似dict,但值是Series对象',
'split': '分离格式,包含index, columns, data三个键',
'tight': '紧凑格式,包含index, columns, data, index_names等',
'index': '索引字典格式,索引为键'
}
df.to_dict(orient='records')
# 一般来说使用records和list比较多
'''
类型 颜色 年龄
狗 黑 8
猫 白 5
鱼 黄 1
'''
# records
[{'类型': '狗', '颜色': '黑', '年龄': 8}, {'类型': '猫', '颜色': '白', '年龄': 5}, {'类型': '鱼', '颜色': '黄', '年龄': 1}]
# dict
{'类型': {0: '狗', 1: '猫', 2: '鱼'}, '颜色': {0: '黑', 1: '白', 2: '黄'}, '年龄': {0: 8, 1: 5, 2: 1}}
# list
{'类型': ['狗', '猫', '鱼'], '颜色': ['黑', '白', '黄'], '年龄': [8, 5, 1]}
# series
'''
{'类型': 0 狗
1 猫
2 鱼
Name: 类型, dtype: object, '颜色': 0 黑
1 白
2 黄
Name: 颜色, dtype: object, '年龄': 0 8
1 5
2 1
Name: 年龄, dtype: int64}
'''
# split
{'index': [0, 1, 2], 'columns': ['类型', '颜色', '年龄'], 'data': [['狗', '黑', 8], ['猫', '白', 5], ['鱼', '黄', 1]]}
# tight
{'index': [0, 1, 2], 'columns': ['类型', '颜色', '年龄'], 'data': [['狗', '黑', 8], ['猫', '白', 5], ['鱼', '黄', 1]], 'index_names': [None], 'column_names': [None]}
# index
{0: {'类型': '狗', '颜色': '黑', '年龄': 8}, 1: {'类型': '猫', '颜色': '白', '年龄': 5}, 2: {'类型': '鱼', '颜色': '黄', '年龄': 1}}

浙公网安备 33010602011771号