四时宝库

程序员的知识宝库

10个Python命令行技巧,让你效率翻倍

在编程的世界里,重复性工作就像是我们每天都要面对的“琐事”,它们看似微不足道,却在无形中消耗着我们的时间和精力。如果你是一名 Python 开发者,可能经常会遇到这样的场景:需要批量重命名文件,想快速了解某个文件夹的大小,或者在大量的代码中查找某个特定的字符串。这些任务,我们通常可以通过一些系统命令来完成,但 Python 的强大之处在于,它能将这些操作变得更加灵活和自动化。

本文将深入探讨 10 个实用的 Python 命令行技巧,这些技巧并非空泛的理论,而是作者在实际工作中,特别是在“只想修一个 Bug”却耗费数小时的深夜里,亲身验证过的“救命稻草”。它们以自动化为核心,以解决实际问题为导向,旨在帮助你从繁琐的重复劳动中解脱出来,大幅提升工作效率。正如一句编程界的“箴言”所说:“自动化之于编程,如同浓缩咖啡之于清晨——理论上并非必需,但在实践中却能改变生活”。

让我们一起探索这些技巧,将命令行打造成你的自动化“金矿”,真正做到事半功倍。

1. 批量重命名文件:告别手动操作的“内耗”

你是否曾收到设计师发来的几十个名为“final_v2_new.png”的文件,然后不得不一个一个地去修改文件名?这种手动操作不仅效率低下,还容易出错。Python 的os模块可以轻松解决这个问题,让你在几秒钟内完成对数百个文件的批量重命名。

核心思想是遍历指定文件夹中的所有文件,然后根据规则生成新的文件名,最后使用os.rename()函数进行重命名。

代码片段:

import os
folder = "path/to/folder"  # 替换为你的文件夹路径
for count, filename in enumerate(os.listdir(folder), start=1):
    ext = os.path.splitext(filename)[1]
    new_name = f"file_{count}{ext}"
    os.rename(os.path.join(folder, filename),
              os.path.join(folder, new_name))

技巧解析:

  • os.listdir(folder):这个函数会返回指定文件夹中所有文件和子文件夹的名称列表。
  • enumerate(..., start=1)enumerate函数可以同时获取列表中元素的索引和值。这里我们从 1 开始计数,为文件名提供一个递增的序号。
  • os.path.splitext(filename)[1]:这个函数用于分离文件名和扩展名,[1]则获取了文件扩展名部分(例如.png)。
  • f"file_{count}{ext}":f-string 是 Python 中一种非常方便的格式化字符串的方式,我们用它来构建新的文件名,例如“file_1.png”、“file_2.png”。
  • os.path.join(...):这个函数的作用是将多个路径组合成一个完整的路径,确保在不同操作系统下都能正确工作。
  • os.rename(old_path, new_path):这是核心函数,用于将文件从old_path重命名为new_path

通过这个简单的脚本,你可以在任何时候面对类似的文件重命名任务时,都能从容应对,将重复劳动转化为一次性的自动化操作。

2. 文件夹大小速查:告别“du -sh”的繁琐,拥抱 Pythonic 方式

在 Linux 或 macOS 系统中,我们通常使用du -sh命令来查看文件夹大小。这个命令虽然有效,但如果你想在 Python 脚本中集成这个功能,或者以更友好的方式呈现结果,Python 的os模块再次提供了优雅的解决方案。

代码片段:

import os

def get_size(path):
    total = 0
    for dirpath, _, filenames in os.walk(path):
        for f in filenames:
            fp = os.path.join(dirpath, f)
            total += os.path.getsize(fp)
    return total / (1024 * 1024)  # MB

print(f"Folder size: {get_size('/path/to/folder'):.2f} MB")

技巧解析:

  • os.walk(path):这是一个非常有用的生成器函数,它会遍历指定路径下的所有子目录和文件。在每次迭代中,它会返回一个三元组:(dirpath, dirnames, filenames),分别代表当前目录路径、子目录名称列表和文件名称列表。我们这里只关心文件,所以使用了_来忽略dirnames
  • os.path.getsize(fp):这个函数用于获取指定文件的字节大小。
  • total += ...:我们将所有文件的大小累加起来,得到文件夹的总大小(以字节为单位)。
  • total / (1024 * 1024):为了让结果更直观,我们将字节大小转换为兆字节(MB)。
  • f"Folder size: {get_size(...):.2f} MB":同样使用 f-string,:.2f表示将结果格式化为两位小数,让输出更加整洁。

这个脚本不仅可以作为一个独立的工具来使用,你还可以将它封装成一个命令行工具,定期运行在你的下载文件夹上,防止它成为一个“数字垃圾场”。

3. grep式文件搜索:用 Python 的正则表达式超能力

当你需要在一个项目中查找所有“TODO”标记,或者任何其他符合特定模式的字符串时,grep命令是一个不错的选择。但如果你想在搜索的同时进行更复杂的逻辑处理,或者想利用 Python 强大的正则表达式功能,那么使用 Python 脚本会是更好的选择。

代码片段:

import re
import os
pattern = re.compile(r"TODO", re.IGNORECASE)
for root, _, files in os.walk("."):
    for file in files:
        path = os.path.join(root, file)
        try:
            with open(path, "r", encoding="utf-8") as f:
                if pattern.search(f.read()):
                    print(path)
        except Exception:
            pass

技巧解析:

  • re.compile(r"TODO", re.IGNORECASE)re.compile函数用于编译正则表达式,可以提高多次使用时的效率。r"..."表示原始字符串,可以避免反斜杠的转义问题。re.IGNORECASE标志让搜索不区分大小写,这样“TODO”、“todo”都能被找到。
  • os.walk(".")os.walk在这里用于遍历当前目录(.)及其所有子目录。
  • with open(...) as f:with语句是一种安全的打开和关闭文件的方式,它能确保文件在使用完毕后被自动关闭,即使发生错误也不例外。
  • pattern.search(f.read())pattern.search()方法会扫描整个字符串,寻找第一个匹配的位置。如果找到了,它会返回一个匹配对象;否则,返回None。这里我们通过判断返回值是否为None来确定文件是否包含目标字符串。
  • try...except:这个结构用于处理文件读取可能出现的异常,例如文件编码错误。

这个脚本非常适合用来追踪那些你已经忽略了几个月的“TODO”任务,帮助你更好地管理代码。

4. 快速合并 PDF:告别“14 个独立合同”的困扰

想象一下,你的客户给你发来了 14 个独立的 PDF 文件,而你需要将它们合并成一个完整的合同。如果手动操作,这无疑是一项繁琐且耗时的工作。使用PyPDF2库,你可以轻松地通过几行代码完成 PDF 的合并。

代码片段:

from PyPDF2 import PdfMerger
merger = PdfMerger()
for pdf in ["1.pdf", "2.pdf", "3.pdf"]:
    merger.append(pdf)
merger.write("merged.pdf")
merger.close()

技巧解析:

  • from PyPDF2 import PdfMerger:首先,你需要安装PyPDF2库(pip install PyPDF2)。然后,我们从库中导入PdfMerger类。
  • merger = PdfMerger():创建一个PdfMerger对象,它将用于处理 PDF 合并操作。
  • merger.append(pdf):在循环中,我们将每个 PDF 文件“追加”到merger对象中。
  • merger.write("merged.pdf"):这个方法将所有追加的 PDF 文件合并,并写入一个新的文件merged.pdf
  • merger.close():最后,调用close()方法,释放资源。

这个脚本只需要运行一次,就可以帮你省去每个季度处理类似任务时的“头痛”。

5. 自动剪贴板保存:告别“我刚才复制了什么?”的困惑

你是否曾经不小心覆盖了剪贴板上的重要信息,然后苦苦回想自己刚才复制了什么?这个脚本可以自动将你复制到剪贴板上的任何内容保存到一个文件中,彻底解决这个问题。

代码片段:

import pyperclip
import time
with open("clipboard_history.txt", "a") as f:
    old_text = ""
    while True:
        text = pyperclip.paste()
        if text != old_text:
            f.write(text + "\n" + "-"*40 + "\n")
            old_text = text
        time.sleep(1)

技巧解析:

  • import pyperclippyperclip是一个跨平台的 Python 模块,用于处理剪贴板操作。你需要先安装它(pip install pyperclip)。
  • open("clipboard_history.txt", "a"):我们以“追加”("a")模式打开一个文件。这意味着每次写入时,内容都会被添加到文件末尾,而不是覆盖原有内容。
  • while True::这是一个无限循环,脚本会持续运行。
  • pyperclip.paste():这个函数会返回当前剪贴板中的内容。
  • if text != old_text::我们通过比较当前剪贴板内容和上一次的内容,来判断是否有新的内容被复制。
  • time.sleep(1):让程序暂停 1 秒钟,避免 CPU 占用过高。

这个脚本不仅能防止你丢失重要信息,作者甚至曾用它在一次断电后恢复了关键的 API 密钥。

6. 命令行计时器:精确测量脚本运行时间

当你需要知道一个脚本或者一段操作实际花费了多长时间时,Python 的time模块提供了一个简单而精确的解决方案。这个计时器脚本可以帮你摆脱对“人类诚实”的依赖,得到真实的时间数据。

代码片段:

import time
start = time.perf_counter()
input("Press Enter to stop...")
end = time.perf_counter()
print(f"Elapsed time: {end - start:.2f} seconds")

技巧解析:

  • time.perf_counter():这个函数会返回一个性能计数器的值,它不受系统时间变化的影响,非常适合用于测量短时间间隔。
  • input(...)input()函数会暂停程序执行,等待用户输入并按下回车键。我们利用这个特性,让程序在用户准备好时开始,在用户按下回车时结束计时。
  • end - start:两个时间戳相减,得到的就是经过的时间。

这个脚本可以帮助你准确地评估代码的性能,或者简单地为你完成某项任务所需的时间提供一个客观的参考。

7. Markdown 转 PDF:博客作者的“福音”

对于经常使用 Markdown 写作的博客作者来说,将文章转换为 PDF 是一个常见的需求。这个脚本可以让你在一条命令中完成这个任务,省去了使用在线工具或复杂软件的麻烦。

代码片段:

import markdown
import pdfkit
with open("post.md", "r") as f:
    html = markdown.markdown(f.read())
pdfkit.from_string(html, "post.pdf")

技巧解析:

  • import markdownmarkdown库用于将 Markdown 格式的文本转换为 HTML 格式。你需要先安装它(pip install markdown)。
  • import pdfkitpdfkit库用于将 HTML 文件或字符串转换为 PDF。你需要先安装它(pip install pdfkit),并且需要确保系统中安装了wkhtmltopdf工具。
  • markdown.markdown(f.read()):读取 Markdown 文件内容,然后使用markdown.markdown()函数将其转换为 HTML 字符串。
  • pdfkit.from_string(html, "post.pdf"):这个函数接受 HTML 字符串作为输入,并将其保存为指定的 PDF 文件。

通过这个脚本,你可以轻松地将你的博客文章、文档或其他任何 Markdown 文件存档为 PDF,甚至可以自动化这个过程,定期将你的博客内容归档。

8. 自动清理下载文件夹:给你的 SSD“减负”

下载文件夹常常会成为一个“数字垃圾场”,里面堆满了各种不再需要的文件,占用宝贵的磁盘空间。这个脚本可以帮助你自动清理超过指定天数的旧文件,让你的 SSD 保持“干净”。

代码片段:

import os
import time
import shutil
downloads = "/path/to/Downloads"  # 替换为你的下载文件夹路径
days = 30
now = time.time()
for filename in os.listdir(downloads):
    path = os.path.join(downloads, filename)
    if os.stat(path).st_mtime < now - days * 86400:
        if os.path.isfile(path):
            os.remove(path)
        else:
            shutil.rmtree(path)

技巧解析:

  • days = 30:你可以根据自己的需要调整这个值,来决定多久清理一次。
  • now = time.time():获取当前时间戳(自 1970 年 1 月 1 日以来的秒数)。
  • os.stat(path).st_mtime:获取文件的最后修改时间。
  • now - days * 86400:计算出 30 天前的时间戳。86400是一天中的秒数。
  • if os.stat(path).st_mtime < ...:如果文件的最后修改时间早于 30 天前,那么我们就认为它是一个“旧”文件。
  • os.path.isfile(path):判断路径是否为文件。如果是文件,使用os.remove()删除。
  • shutil.rmtree(path):如果路径是文件夹,使用shutil.rmtree()递归地删除整个文件夹。

将这个脚本设置成一个定时任务(例如使用cron job),你的下载文件夹就可以实现“自动维护”,永远保持整洁。

9. 命令行生成安全密码:告别“123456”的时代

使用弱密码是很多安全问题的根源,但每次手动想出一个既安全又好记的密码又是一件痛苦的事情。这个脚本可以让你在命令行中快速生成一个随机且安全的密码,让你彻底告别那些带有广告的在线密码生成器。

代码片段:

import secrets
import string
chars = string.ascii_letters + string.digits + string.punctuation
password = ''.join(secrets.choice(chars) for _ in range(20))
print(password)

技巧解析:

  • import secretssecrets模块是 Python3.6 及以上版本中推荐使用的模块,用于生成加密安全的随机数,比random模块更适合用于密码、令牌等安全敏感的场景。
  • import stringstring模块包含了各种字符串常量,例如所有大写字母、小写字母、数字和标点符号。
  • chars = ...:我们将所有可能用于密码的字符组合在一起。
  • secrets.choice(chars)secrets.choice()函数会从chars字符串中随机选择一个字符。
  • ''.join(...):我们使用列表推导式生成 20 个随机字符,然后使用''.join()将它们连接成一个字符串,形成最终的密码。

这个脚本简单、快速、安全,可以成为你日常工作中不可或缺的小工具。

10. Git 提交提醒:避免“忘记提交”的尴尬

在团队协作中,忘记提交代码可能会导致各种问题,例如代码冲突、功能缺失等。这个脚本可以像一个“保姆”一样,每隔一段时间提醒你检查是否有未提交的更改,帮助你养成良好的提交习惯。

代码片段:

import subprocess
import time
while True:
    status = subprocess.getoutput("git status --porcelain")
    if status:
        print("You have uncommitted changes. Commit them now!")
    time.sleep(3600)  # Every hour

技巧解析:

  • import subprocesssubprocess模块用于在 Python 中执行系统命令。
  • subprocess.getoutput("git status --porcelain"):我们执行git status --porcelain命令。这个命令以一种机器可读的格式输出 Git 状态,如果存在未提交的更改,它会返回一个非空的字符串。
  • if status::如果status字符串不为空(即存在未提交的更改),程序就会打印提醒信息。
  • time.sleep(3600):让程序每小时运行一次。

这句古老的 Git 谚语说得好:“一天一次提交,远离合并冲突”。这个脚本可以帮助你将这句谚语付诸实践。

总结:将“痛苦”转化为“生产力”

以上这 10 个 Python 命令行技巧,每一个都源于对重复性任务的“厌恶”。它们证明了命令行不仅仅是一个执行命令的工具,更是一个进行“微自动化”的游乐场。

当你再次面对那些让你感到“天啊,又来了”的任务时,不要抱怨,把它当作一个信号:你找到一个新的自动化机会了。从一个小脚本开始,将这些技巧应用到你的日常工作中,你会发现,你的工作流变得更加顺畅,你的生产力也得到了显著提升。

最后,别忘了为你经常使用的那些脚本设置别名(alias),这样你就可以通过一个简单的命令来执行它们,让自动化成为你工作中的“第二天性”。

#Python基础#

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接