1. 程式人生 > >利用python監聽剪貼簿內容,並修改。

利用python監聽剪貼簿內容,並修改。

前言

由於我在讀論文的時候常常需要複製論文片段,然後論文(pdf格式)中常常有多餘的換行符,所以貼上到txt或者markdown文字中都會很不美觀,我希望能利用python指令碼把換行符去掉,在此記錄過程。

預期要實現的功能:
1)複製一個pdf中的論文片段,沒處理之前是這樣:
在這裡插入圖片描述

無論是放到部落格中還是儲存到txt中,感覺閱讀起來都不是很自然。

2)在用python指令碼處理之後,貼上到txt或者markdown檔案中後,剛剛複製的文字已經變成去除換行的文字,所以預期的輸出為:
在這裡插入圖片描述

這樣就更加自然了(去除了僵硬了換行符)。

在此附上原始碼及EXE(感覺這個EXE是可以在windows系統上通用的,因為exe裡面應該自帶了很多依賴):

我的CSDN資源頁

1. 編寫程式碼

1.1 說明

中間參考了很多網站,天色已晚然而要寫的細節又太多,所以權衡之下,這裡列出這些文獻,不一一贅述。
參考:
[3] 用python模組pyperclip對系統剪貼簿進行讀寫
[4] 有關正則表示式將多餘空格轉為一個空格的操作)
[5] 有關python捕獲KeyboardInterrupt的方法
[6] 有關去掉行尾換行符的方法
[7] 有關去掉換行符的方法
[8] 有關python讀寫剪貼簿的操作
[9] 有關讀取剪下板內容的操作

其中主要參考:[3]和[4]。

1.2 具體程式碼

具體程式碼如下:

import time
import sys
import os
import re
sys.path.append(os.path.abspath("SO_site-packages"))
import pyperclip  # 引入模組

recent_value = ""
tmp_value="" # 初始化(應該也可以沒有這一行,感覺意義不大。但是對recent_value的初始化是必須的)

while True:
    tmp_value = pyperclip.paste() 			# 讀取剪下板複製的內容
    
    try:
        if tmp_value != recent_value:				 #如果檢測到剪下板內容有改動,那麼就進入文字的修改
            recent_value = tmp_value
            changed = out = re.sub(r"\s{2,}", " ", recent_value) 	#將文字的換行符去掉,變成一個空格
            pyperclip.copy(changed) 							#將修改後的文字寫入系統剪下板中
            print("\n Value changed: %s" % str(changed))  	# 輸出已經去除換行符的文字
        time.sleep(0.1)
    except KeyboardInterrupt:  # 如果有ctrl+c,那麼就退出這個程式。  (不過好像並沒有用。無傷大雅)
        break
        
    if tmp_value == 'getend': # 如果複製的是getend,就退出程式。(這個主要是為了方便我在spyder中執行、退出的時候用的。)
        break

2. 安裝pyperclip

有了前面一段程式碼,還必須安裝pyperclip:
直接在anaconda prompt中輸入:
conda install pyperclip
即可安裝。

3. 將python檔案打包成exe檔案(雙擊即可執行,非常方便)

3.1 安裝pyinstaller

這時候需要安裝pyinstaller模組。

然後等就是了,它會自動下載一些依賴。

下載完之後,輸入pyinstaller -h,如果顯示出相關幫助資訊,那麼說明安裝成功了。

3.2 打包成exe

這時候繼續在anaconda prompt中執行:
pyinstaller -F 11-17.py (注意:這個11-17.py就是我的原始碼對應的檔案,放在桌面上了。)
在這裡插入圖片描述

一開始會報錯,報錯資訊:

Exception:
            Cannot find existing PyQt5 plugin directories
            Paths checked: C:/Miniconda3/conda-bld/qt_1535195524645/_h_env/Library/plugins

這時候參考:[10]
即:
1) 建立一個這樣的資料夾 C:/Miniconda3/conda-bld/qt_1535195524645/_h_env/Library/plugins
2) 將anaconda安裝路徑下的Library/plugins/PyQts5 中的dll檔案拷貝到剛剛新建的資料夾下,如下:
在這裡插入圖片描述
3) 重新在prompt中輸入:
pyinstaller -F 11-17.py
即可。

補充: [11]

使用

cd C:/
md Miniconda3/conda-bld/qt_1535195524645/_h_env/Library/plugins

來一次建立多級目錄。(其實這個搜尋挺難搜的,很難找到合適的搜尋關鍵字。我當時用的關鍵字是:windows cmd 遞迴新建資料夾 。。。所以定關鍵字也是挑戰。)

4) 此時根據prompt中輸出資訊的提示:22389 INFO: Appending archive to EXE C:\Users\dehen\Desktop\dist\11-17.exe
在桌面的dist資料夾中找到了11-17.exe。
雙擊執行,即可順利完成我的功能。
在這裡插入圖片描述

感覺挺萌的一個exe圖示。。。

5) 如果想退出,可以crtl+c 或者 直接右上角關掉視窗就好。關掉之後也就不佔用系統資源了。
平時想用的時候直接開啟,非常方便。

4. 其他資訊

在此過程中還進行了一些其他嘗試,不忍刪除,所以也記錄下來了。

4.1 下載pyhook

在anconda prompt和navigator下都沒有找到pyhook。

在prompt下嘗試的時候,報錯:

Solving environment: failed

PackagesNotFoundError: The following packages are not available from current channels:

  - pyhook

Current channels:

  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/win-64
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/noarch
  - https://repo.anaconda.com/pkgs/main/win-64
  - https://repo.anaconda.com/pkgs/main/noarch
  - https://repo.anaconda.com/pkgs/free/win-64
  - https://repo.anaconda.com/pkgs/free/noarch
  - https://repo.anaconda.com/pkgs/r/win-64
  - https://repo.anaconda.com/pkgs/r/noarch
  - https://repo.anaconda.com/pkgs/pro/win-64
  - https://repo.anaconda.com/pkgs/pro/noarch
  - https://repo.anaconda.com/pkgs/msys2/win-64
  - https://repo.anaconda.com/pkgs/msys2/noarch

To search for alternate channels that may provide the conda package you're
looking for, navigate to

    https://anaconda.org

and use the search bar at the top of the page

表示一臉懵逼。

然後參考了[1],裡面還有很多很有意思的conda指令:

conda config --add channels new_channel #優先順序最高
conda config --prepend channels new_channel #優先順序平等(equivalent)
conda config --append channels new_channel #優先順序最低`

在這裡下,然後再(在anaconda prompt中)pip install,應該是不會有問題的。(注意選對版本就行)

5. 總結

時間真的太快,還是要珍惜時間。

此外,應該多琢磨一下搜尋技巧(如關鍵字的確定 等),這樣才能高效找到答案。

此外,還要進一步學好英語,才能方便閱讀英文網頁。。。

不學了,休息…

參考文獻