網站首頁 編程語言 正文
楔子
pandas 里面有一個 pd.read_clipboard 函數,可以根據你復制的內容生成DataFrame。是的,就是我們平時選中,然后 Ctrl+C 時拷貝的內容。所以比較神奇,那么 pandas 到底是怎么做到的,它是怎么讀出我們使用 Ctrl +C 復制的內容呢。
看了一下源碼,不同的操作系統使用的復制方式不同,Windows 比較復雜,方法是使用了ctypes,然后調用了操作系統的一個動態庫實現的;而 macOS 和 Linux 比較簡單,調用的是內置的命令。
下面我們來看看如何在這三個系統上實現復制粘貼的功能。
Windows?上的復制粘貼
我們說 Windows 是使用?ctypes 調用動態庫實現的,比較麻煩。但是我們知道?Python?有一個?pywin32 模塊,對于?Windows?操作系統提供的接口進行了封裝。所以在 Windows 上我們會使用 pywin32 來實現復制粘貼功能。
該模塊直接通過 pip install pywin32 安裝即可。
import?win32clipboard?as?wcb
import?win32con?as?wc
#?打開復制粘貼板
wcb.OpenClipboard()
#?我們之前可能已經?Ctrl?+?C?了
#?這里是清空目前?Ctrl?+?C?復制的內容
#?但顯然沒有這一步也無所謂,因為第二次復制會覆蓋第一次復制的內容
wcb.EmptyClipboard()
#?將內容寫入復制粘貼板,第一個參數是?win32con.CF_TEXT
#?第二個參數是我們要復制的內容,編碼的時候指定為?"gbk"
wcb.SetClipboardData(wc.CF_TEXT,?"古明地覺".encode("gbk"))
#?關閉復制粘貼板
wcb.CloseClipboard()
然后我們 Ctrl+V 粘貼就會得到 "古明地覺" 這個字符串,另外編碼的時候要使用 gbk,因為我當前操作系統默認編碼使用的是 gbk,所以會對我們輸入的字節使用 gbk 解碼。因此如果使用 utf-8 編碼的話,那么粘貼之后得到的就會是亂碼。當然具體編碼根據你當前的機器決定。
復制我們實現了,下面來看看怎么實現粘貼。
import?win32clipboard?as?wcb
import?win32con?as?wc
wcb.OpenClipboard()
#?獲取粘貼板內容,既然是獲取,那么只需要一個參數即可
#?會返回已經使用?Ctrl?+?C?復制的內容
data?=?wcb.GetClipboardData(wc.CF_TEXT)
#?關閉復制粘貼板
wcb.CloseClipboard()
#?然后隨便?Ctrl+C?拷貝一段內容
#?下面就會將拷貝的內容打印出來
print(data.decode("gbk"))
還是很簡單的,我們上面使用的模塊是 win32 系列,所以它只適用于 Windows 系統。那如果我想在 Linux 和 macOS 中實現怎么辦呢?也很簡單,事實上,這兩個系統實現起來反而會更簡單,因為自帶了相關的命令。
macOS?上的復制粘貼
macOS 自帶了相關命令,我們只需要通過 subprocess 模塊去調用即可,舉個例子:
非常簡單,那么代碼要如何實現呢?
import?subprocess
#?實現拷貝
def?copy(text):
????p?=?subprocess.Popen(["pbcopy",?"w"],
?????????????????????????stdin=subprocess.PIPE,
?????????????????????????close_fds=True)
????#?將內容拷貝起來,注意?macOS?的編碼默認是?utf-8
????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")
copy("古明地覺的編程教室")
print(paste())??#?古明地覺的編程教室
以上代碼在 macOS 上執行,由于自帶了復制粘貼相關的命令,操作起來就比 Windows 方便多了。
Linux?上的復制粘貼
Linux 也提供了復制粘貼的命令,叫 xclip,但這個命令不是自帶的,我們需要使用 yum 安裝。
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?上通過命令實現復制粘貼沒什么意義,因為我們都是通過 SSH 遠程連接到公司的服務器,這種情況下 xclip 是不生效的。
當然,感覺這個功能也沒多大用,當做興趣了解一下就行。
pyperclip 實現復制粘貼
最后我們再來介紹一個模塊,叫 pyperclip,它對不同的操作系統的復制粘貼功能進行了封裝,可以簡化我們的操作。舉個例子:
import?pyperclip
#?復制
pyperclip.copy("哼哼")
#?粘貼
print(pyperclip.paste())??#?哼哼?
還是很方便的,以后就可以使用這個模塊,自動幫我們屏蔽了操作系統間的差異。另外,這個模塊只支持復制文本。
原文鏈接:https://mp.weixin.qq.com/s/wLhxP9YFPIt590zMpadtUA
相關推薦
- 2022-04-26 C#新特性之可空引用類型_C#教程
- 2022-12-24 C#?Math中常用數學運算的示例詳解_C#教程
- 2023-05-06 C++右值引用與移動構造函數基礎與應用詳解_C 語言
- 2022-01-26 阿里云服務器端口請求失敗(在控制臺把端口添加到服務器的安全組)
- 2022-12-03 Go?語言單例模式示例詳解_Golang
- 2022-10-06 C++?pimpl機制詳細講解_C 語言
- 2022-09-25 面向對象和面向過程:兩種程序設計思想的基礎介紹和對比
- 2022-11-05 關于Python?Tkinter?復選框?->Checkbutton_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支