文件的常用操作

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}}
posted @ 2025-12-03 20:08  树下黑猫  阅读(6)  评论(0)    收藏  举报