如何用python实现复制粘贴功能

楔子

pandas里面有这么一个方法:pd.read_clipboard,可以根据你复制的内容生成DataFrame。是的,就是我们平时选中,然后复制、或者Ctrl+C时拷贝的内容,所以比较神奇,那么pandas到底是怎么做到的,它是怎么读出我们使用Ctrl +C复制的内容呢。

看了一下源码,非常的复杂,方法是使用了ctypes,然后调用了操作系统的一个动态库实现的。ctypes是专门来调用C、C++使用的,但是我们知道Python有一个pywin32模块,对于Windows操作系统提供的接口进行了封装。所以下面我们使用pywin32来实现我们平时使用的复制粘贴功能。

首先是安装:pip install pywin32

实现复制

下面我们来看看如何使用这个模块实现复制功能,另外关于pywin32这个模块,它的家族非常的庞大。

里面有很多的win32xxx.pyd,我们直接调用就行。

# win32clipboard专门用来复制粘贴的
import win32clipboard as wcb
import win32con as wc

# 打开复制粘贴板
wcb.OpenClipboard()
# 我们之前可能已经Ctrl+C了,这里是清空目前Ctrl+C复制的内容。但是经过测试,这一步即使没有也无所谓
wcb.EmptyClipboard()
# 将内容写入复制粘贴板,第一个参数win32con.CF_TEXT不用管,我也不知道它是干什么的
# 关键第二个参数,就是我们要复制的内容,一定要传入字节
wcb.SetClipboardData(wc.CF_TEXT, "古明地觉世界第一可爱".encode("gbk"))
# 关闭复制粘贴板
wcb.CloseClipboard()

然后我们 Ctrl+V 粘贴就会得到 "古明地觉世界第一可爱" 这个字符串,再强调一次,这里不能传入字符串、而是要传入字节。如果传入字符串,那么中文会得到乱码、ascii文本只会得到第一个字符。

另外这里要使用 gbk,因为我当前操作系统默认编码使用的是gbk,所以会对我们输入的字节使用 gbk 解码。因此如果使用utf-8编码的话,那么粘贴得到的依旧是乱码。当然具体根据你当前的机器决定。

实现粘贴

复制我们实现了,下面来看看怎么实现粘贴。

# win32clipboard专门用来复制粘贴的
import win32clipboard as wcb
import win32con as wc

# 打开复制粘贴板
wcb.OpenClipboard()
# 获取粘贴板内容,既然是获取,那么只需要一个参数即可。
# 会返回已经使用Ctrl+C复制得到的内容
data = wcb.GetClipboardData(wc.CF_TEXT)
# 关闭复制粘贴板
wcb.CloseClipboard()

# 得到的依旧是字节
"""
我们在"实现复制"的时候说过,因为Ctrl+V默认使用gbk解码,所以在模拟Ctrl+C的时候我们也要传入使用gbk编码的字符串
那么在"实现粘贴"的时候也是一样,我们使用Ctrl+C复制的时候,也会使用gbk编码成字节
那么这里模拟Ctrl+V得到字节之后也要使用gbk解码
"""
# 然后随便Ctrl+C拷贝一段内容,下面就会将拷贝的内容打印出来
print(data.decode("gbk"))

我们上面的模块是win32家族,所以它只适用于Windows系统,不适用于Linux和macOS。那么如果我想在Linux和macOS中实现怎么办呢?也很简单,事实上,这两个系统实现起来反而会更简单,因为自带了相关的命令。

macOS实现复制粘贴

import subprocess

# 实现拷贝
def copy(text):
  p = subprocess.Popen(["pbcopy", "w"], stdin=subprocess.PIPE, close_fds=True)
  # 将内容(text)拷贝起来
  p.communicate(input=text.encode("utf-8"))

# 实现粘贴
def paste():
  p = subprocess.Popen(["pbpaste", "r"], stdout=subprocess.PIPE, close_fds=True)
  stdout, stderr = p.communicate()
  #返回粘贴内容
  return stdout.decode("utf-8") 

Linux实现复制粘贴

注意:Linux上实现复制粘贴实际上意义不大,因为实现复制粘贴的功能的一个前提是你必须要有显示器。

而公司使用的服务器肯定不会带显示器的,使用的时候都是通过xshell远程连接。但是Linux上也提供了相应的命令,叫xclip,当然这个命令不是自带的,使用的时候可能还要安装:yum install xclip。下面来看看怎么通过 Python 调用,实际上和macOS一样。

import subprocess

# 实现拷贝
def copy(text):
  p = subprocess.Popen(
      ["xclip", "-selection", "c"], stdin=subprocess.PIPE, close_fds=True
    )
  p.communicate(input=text.encode("utf-8"))

# 实现粘贴
def paste():
  p = subprocess.Popen(
      ["xclip", "-selection", "c", "-o"], stdout=subprocess.PIPE, close_fds=True
    )
  stdout, stderr = p.communicate()
  return stdout.decode("utf-8") 

可以看到Linux和macOS还是比较简单的,因为操作系统提供了这个命令,我们可以直接使用。但是Windows则没有提供,所以需要使用ctypes,或者使用封装好的pywin32。

另外还是那句话,Linux上执行需要有显示器,我以我阿里云上的centos为例。

提示我们无法打开显示器,因为根本就没有。 当然,感觉这个功能也没多大用,当做兴趣了解一下就行。

以上就是如何用python实现复制粘贴功能的详细内容,更多关于python实现复制粘贴功能的资料请关注我们其它相关文章!

(0)

相关推荐

  • linux 下python多线程递归复制文件夹及文件夹中的文件

    本文是利用python 复制文件夹 刚开始写了一个普通的递归复制文件夹    然后想了想 觉得对io频繁的程序 threading 线程还比较友好  就写了个多线程版本的  最恶心人的地方就是路径  其他都还好吧 import os import threading import multiprocessing length_of_folder = 0 def copyfile(Path): if os.path.isdir(Path): print("-----------%s" %

  • Python文件名匹配与文件复制的实现

    文件名的匹配,实际上就是相当于获取文件名(不含后缀),然后利用获取到的文件名到另外一个文件夹中去寻找对应的文件,然后将文件取出,放置到指定文件夹下.概括的来说,分三个步骤:一是取出遍历目录A,得到各个文件文件名:二是利用该文件名,与指定路径B拼接,并加上后缀,产生目标文件名:三是根据拼接产生的目标文件名,将相应文件复制到指定目录C. 好,那么我们开始写代码吧~~~ step1:获取指定目录A下面的所有文件名.不包含文件后缀.主要基于以下思想: def GetFileNameAndExt(file

  • python 解压、复制、删除 文件的实例代码

    压缩复制删除文件基于python语言怎么操作呢,压缩文件有四种格式:zip.rar.tar.tar.gz,在压缩过程中也容易出现很多问题,今天小编通过代码给大家详解,具体内容如下所示: 一.python3解压文件 1.python 解压文件代码示例 如下代码主要实现zip.rar.tar.tar.gz四种格式的压缩文件的解压 def unzip_file(src_file, dst_dir=None, unzipped_files=None, del_flag=True): ""&qu

  • python如何实现复制目录到指定目录

    本文实例为大家分享了python复制目录到指定目录的具体代码,供大家参考,具体内容如下 保存下面代码为一个文件直接运行 import os import time copyFileCounts = 0 def copyFiles(sourceDir, targetDir): global copyFileCounts print (sourceDir) print (u"%s 当前处理文件夹%s已处理%s 个文件" %(time.strftime('%Y-%m-%d %H:%M:%S'

  • python通用读取vcf文件的类(复制粘贴即可用)

    前言 处理vcf文件的时候,需要多种切割,正则匹配,如果要自己写其实会比较麻烦,并且每次还得根据vcf文件格式或者需要读取的值不同要修改相应的代码.因此很多人会选择一些python的vcf的库,但是首先你得安装这个库, 并且有一些库它固定了能够读的内容,如果你的vcf的信息不在它固定的里面,就读不出来.比如最近我想读一个样本的AF,但是它放在最后样本的GT那列,不在INFO那一列,有一些库竟然无能为力.因此我写了这个通用的读vcf的类,直接复制粘贴这部分代码就可以方便的用这个类进行vcf文件的读

  • python pptx复制指定页的ppt教程

    如题,我有一个模板,我想根据需求复制模板中间的某一页多次,比如复制第五页,然后复制3次,那么第六页,第七页,第八页都是和第五页一模一样的ppt,次数是根据我的需求指定的,使用python pptx模块复制,可是不知道有没有相应的方法能实现,我用以下方法行不通: prs = Presentation("Missed Assessment Rate Template.pptx") slide = prs.slides.add_slide(prs.slide_layouts[5]) prs.

  • python实现跨excel sheet复制代码实例

    功能要求: 将test1表中的Sheet1中所有内容复制到新表test的Sheet1表中 测试环境: python 3.7 : import openpyxl :execl2016 注意事项: openpyxl只能处理.xlsx文件,对于较早的.xls版本需要引入xlrd模块及xlwd模块进行操作 代码: #python3读写excel ''' 实现功能: 要把test1中的sheet表内容复制到test表sheet1中 ''' from openpyxl import Workbook fro

  • 复制粘贴功能的Python程序

    今天因为给BeauBeau提供的抽奖号码做SQL文件,一开始收到ZIP文件解开压缩之后被吓到了--29个CSV文件,每个文件保存了1000个奖券ID和号码-_-! 照上次一样,打开每个CSV文件做先做单独的SQL文件,每个SQL中有1000条插入语句,随后将29个文件的所有SQL语句都复制粘贴到同一个总的SQL文件中. CSV文件中的结构是"ID,NUMBER"的结构,其中ID是7位数字,NUMBER是11位数字.这样用正则式来进行捕捉的时候就比较方便了,在Eclipse的查找/替换功

  • python利用os模块编写文件复制功能——copy()函数用法

    我就废话不多说了,大家还是直接看代码吧~ #文件复制 import os src_path=r'E:\Pycharm\python100题\代码' target_path=r'E:\Pycharm\python100题\123' #封装成函数 def copy_function(src,target): if os.path.isdir(src) and os.path.isdir(target): filelist=os.listdir(src) for file in filelist: p

  • 基于python实现复制文件并重命名

    方法: shutil.copy("c://ccc//模板.xlsx","c://ccc//新文件.xlsx") 需求: 已知的Excel模板格式.已知的文件命名规则(存储在Excel中),批量生成文件 代码如下 import shutil import xlrd # 打开存储文件命名规则的文件 data = xlrd.open_workbook('C:ccc\\新新编号.xls') # 打开工作表 table = data.sheet_by_name(u'Sheet

  • Python列表的深复制和浅复制示例详解

    一.深复制与浅复制 列表是Python中自带的一种数据结构,在使用列表时,拷贝操作不可避免,下面简单讨论一下列表的深复制(拷贝)与浅复制 首先看代码: l1 = [5, 4, 3, 2, 1] # 用两种方法实现对列表l1的拷贝 l2 = l1 l3 = l1[:] print(l1) # [5, 4, 3, 2, 1] print(l2) # [5, 4, 3, 2, 1] print(l3) # [5, 4, 3, 2, 1] #修改l1 l1[0] = 9 print(l1) # [9,

随机推荐