代码改变世界

10个关于文件操作的小功能,都很实用~

2020-05-03 20:30  zouhui  阅读(284)  评论(0编辑  收藏  举报

1 优雅的获取文件后缀名

import os
file_ext = os.path.splitext('./data/py/test.py')
front,ext = file_ext
In [5]: front
Out[5]: './data/py/test'

In [6]: ext
Out[6]: '.py'

2 批量修改文件后缀

本例子使用Python的os模块和 argparse模块,将工作目录work_dir下所有后缀名为old_ext的文件修改为后缀名为new_ext

通过本例子,大家将会大概清楚argparse模块的主要用法。

导入模块

import argparse
import os

定义脚本参数

def get_parser():
    parser = argparse.ArgumentParser(
        description='工作目录中文件后缀名修改')
    parser.add_argument('work_dir', metavar='WORK_DIR', type=str, nargs=1,
                        help='修改后缀名的文件目录')
    parser.add_argument('old_ext', metavar='OLD_EXT',
                        type=str, nargs=1, help='原来的后缀')
    parser.add_argument('new_ext', metavar='NEW_EXT',
                        type=str, nargs=1, help='新的后缀')
    return parser

后缀名批量修改

def batch_rename(work_dir, old_ext, new_ext):
    """
    传递当前目录,原来后缀名,新的后缀名后,批量重命名后缀
    """
    for filename in os.listdir(work_dir):
        # 获取得到文件后缀
        split_file = os.path.splitext(filename)
        file_ext = split_file[1]
        # 定位后缀名为old_ext 的文件
        if old_ext == file_ext:
            # 修改后文件的完整名称
            newfile = split_file[0] + new_ext
            # 实现重命名操作
            os.rename(
                os.path.join(work_dir, filename),
                os.path.join(work_dir, newfile)
            )
    print("完成重命名")
    print(os.listdir(work_dir))

实现Main

def main():
    """
    main函数
    """
    # 命令行参数
    parser = get_parser()
    args = vars(parser.parse_args())
    # 从命令行参数中依次解析出参数
    work_dir = args['work_dir'][0]
    old_ext = args['old_ext'][0]
    if old_ext[0] != '.':
        old_ext = '.' + old_ext
    new_ext = args['new_ext'][0]
    if new_ext[0] != '.':
        new_ext = '.' + new_ext

    batch_rename(work_dir, old_ext, new_ext)

3 从路径中提取文件

In [11]: import os
    ...: file_ext = os.path.split('./data/py/test.py')
    ...: ipath,ifile = file_ext
    ...:

In [12]: ipath
Out[12]: './data/py'

In [13]: ifile
Out[13]: 'test.py'

4 查找指定后缀名的文件

import os

def find_file(work_dir,extension='jpg'):
    lst = []
    for filename in os.listdir(work_dir):
        print(filename)
        splits = os.path.splitext(filename)
        ext = splits[1] # 拿到扩展名
        if ext == '.'+extension:
            lst.append(filename)
    return lst

r = find_file('.','md')
print(r) # 返回所有目录下的md文件

5 批量转换xls文件为xlsx

#批量转换文件xls-xlsx
import win32com.client as win32
import os.path
import os


def xls2xlsx():    
    rootdir = r"C:\Users\CQ375\Desktop\temp1" #需要转换的xls文件存放处
    rootdir1 = r"C:\Users\CQ375\Desktop\ex" #转换好的xlsx文件存放处
    files = os.listdir(rootdir) #列出xls文件夹下的所有文件
    num = len(files) #列出所有文件的个数
    for i in range(num): #按文件个数执行次数
        kname = os.path.splitext(files[i])[1] #分离文件名与扩展名,返回(f_name, f_extension)元组
        if kname == '.xls': #判定扩展名是否为xls,屏蔽其它文件
            fname = rootdir + '\\' + files[i] #合成需要转换的路径与文件名
            fname1 = rootdir1 + '\\' + files[i] #合成准备存放转换好的路径与文件名
            excel = win32.gencache.EnsureDispatch('Excel.Application') #调用win32模块
            wb = excel.Workbooks.Open(fname) #打开需要转换的文件
            wb.SaveAs(fname1+"x", FileFormat=51) #文件另存为xlsx扩展名的文件
            wb.Close()
            excel.Application.Quit()
            
            
if __name__ == '__main__':
    xls2xlsx()

6 目录下所有文件的修改时间

import os
import datetime
print(f"当前时间:{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
for root,dirs,files in os.walk(r"D:\works"):#循环D:\works目录和子目录
    for file in files:
        absPathFile=os.path.join(root,file)
        modefiedTime=datetime.datetime.fromtimestamp(os.path.getmtime(absPathFile))
        now=datetime.datetime.now()
        diffTime=now-modefiedTime
        if diffTime.days<20:#条件筛选超过指定时间的文件
            print(f"{absPathFile:<27s}修改时间[{modefiedTime.strftime('%Y-%m-%d %H:%M:%S')}]\
距今[{diffTime.days:3d}天{diffTime.seconds//3600:2d}时{diffTime.seconds%3600//60:2d}]")#打印相关信息

7 批量压缩文件夹和文件

import zipfile  # 导入zipfile,这个是用来做压缩和解压的Python模块;
import os
import time

def batch_zip(start_dir):
    start_dir = start_dir  # 要压缩的文件夹路径
    file_news = start_dir + '.zip'  # 压缩后文件夹的名字

    z = zipfile.ZipFile(file_news, 'w', zipfile.ZIP_DEFLATED)
    for dir_path, dir_names, file_names in os.walk(start_dir):
        # 这一句很重要,不replace的话,就从根目录开始复制
        f_path = dir_path.replace(start_dir, '')
        f_path = f_path and f_path + os.sep  # 实现当前文件夹以及包含的所有文件的压缩
        for filename in file_names:
            z.write(os.path.join(dir_path, filename), f_path + filename)
    z.close()
    return file_news


batch_zip('./data/ziptest')

8 文件读操作

import os
# 创建文件夹

def mkdir(path):
    isexists = os.path.exists(path)
    if not isexists:
        os.mkdir(path)
# 读取文件信息

def openfile(filename):
    f = open(filename)
    fllist = f.read()
    f.close()
    return fllist  # 返回读取内容

9 文件写操作

# 写入文件信息
# example1
# w写入,如果文件存在,则清空内容后写入,不存在则创建
f = open(r"./data/test.txt", "w", encoding="utf-8")
print(f.write("测试文件写入"))
f.close

# example2
# a写入,文件存在,则在文件内容后追加写入,不存在则创建
f = open(r"./data/test.txt", "a", encoding="utf-8")
print(f.write("测试文件写入"))
f.close

# example3
# with关键字系统会自动关闭文件和处理异常
with open(r"./data/test.txt", "w") as f:
    f.write("hello world!")

10 分词并保存文件

pkuseg是北大开源的一个中文分词工具包,它在多个分词数据集上都有非常高的分词准确率,比经常使用的jieba分词性能和效果要更好。

下面使用pkusegcut函数,分词后统计前10频率词,并按照所有词的频次由高到低写入到文件cut_words.csv 中。

这是需要切分的段落:

mystr = """Python 语言参考 描述了 Python 语言的具体语法和语义,
这份库参考则介绍了与 Python 一同发行的标准库。
它还描述了通常包含在 Python 发行版中的一些可选组件。
Python 标准库非常庞大,所提供的组件涉及范围十分广泛,
正如以下内容目录所显示的。这个库包含了多个内置模块 (以 C 编写),
Python 程序员必须依靠它们来实现系统级功能,
例如文件 I/O,此外还有大量以 Python 编写的模块,
提供了日常编程中许多问题的标准解决方案。
其中有些模块经过专门设计,
通过将特定平台功能抽象化为平台中立的 API 来鼓励和加强 Python 程序的可移植性。
Windows 版本的 Python 安装程序通常包含整个标准库,
往往还包含许多额外组件。对于类 Unix 操作系统,
Python 通常会分成一系列的软件包,
因此可能需要使用操作系统所提供的包管理工具来获取部分或全部可选组件。"""

几行代码就完成上述工作:

from pkuseg import pkuseg
from collections import Counter

seg = pkuseg()
words = seg.cut(mystr)
frequency_sort = Counter(words).most_common()
with open('./data/cut_words.csv', 'w') as f:
    for line in frequency_sort:
        f.write(str(line[0])+',' + str(line[1])+"\n")

print('writing done')

出现最高频的前10个词语:

Counter(words).most_common(10)
# [('的', 12), (',', 11), ('Python', 10), ('。', 7), ('了', 5), ('包含', 4), ('组件', 4), ('标准库', 3), ('通常', 3), ('所', 3)]