How do I read text from the Windows clipboard in Python?
Asked Answered
R

15

157

How do I read text from the (windows) clipboard with python?

Rubie answered 19/9, 2008 at 11:9 Comment(2)
Related to this question.Argyres
in my case, only dan answer worked , which uses clipboard package.Anergy
P
151

You can use the module called win32clipboard, which is part of pywin32.

Here is an example that first sets the clipboard data then gets it:

import win32clipboard

# set clipboard data
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardText('testing 123')
win32clipboard.CloseClipboard()

# get clipboard data
win32clipboard.OpenClipboard()
data = win32clipboard.GetClipboardData()
win32clipboard.CloseClipboard()
print data

An important reminder from the documentation:

When the window has finished examining or changing the clipboard, close the clipboard by calling CloseClipboard. This enables other windows to access the clipboard. Do not place an object on the clipboard after calling CloseClipboard.

Player answered 19/9, 2008 at 11:20 Comment(5)
Do you know if there is a way to use the `with´ statement ?Monikamoniker
Worth noting, in py34, win7, SetClipboardText did not work without a preceding call to EmptyClipboardPtosis
This module is useful if you want to perform more complex operations, e.g. getting the HTML-formatted content out of clipboard. See #17299397Laceylach
@Monikamoniker If there is no native way, you can easily create your own custom object that supports "with"Colunga
Not working if I tried to copy a text with multiline using a string variable defined with """Boelter
R
84

you can easily get this done through the built-in module Tkinter which is basically a GUI library. This code creates a blank widget to get the clipboard content from OS.

from tkinter import Tk  # Python 3
#from Tkinter import Tk # for Python 2.x
Tk().clipboard_get()
Relict answered 24/5, 2014 at 11:58 Comment(2)
Far better imo than trying to get pywin32 installed, as that has a spate of known issues. Good tip on the casing difference, was hard to catch at first.Tycoon
For me this creates a leftover Tk() window which is frustrating (and uses up resources). If you're doing this as a one-off, it can be prevented with a couple more lines: a = Tk(); clipboard = a.clipboard_get(); a.destroy()Daukas
H
65

I found pyperclip to be the easiest way to get access to the clipboard from python:

  1. Install pyperclip: pip install pyperclip

  2. Usage:

import pyperclip
    
s = pyperclip.paste()
pyperclip.copy(s)
    
# the type of s is string

Pyperclip supports Windows, Linux and Mac, and seems to work with non-ASCII characters, too. Tested characters include ±°©©αβγθΔΨΦåäö

Harriet answered 3/7, 2016 at 15:54 Comment(6)
does it suitable for 3.6? it is installed succesfully but when used paste () method it gives me error:" from PySide import version as PYSIDE_VERSION # analysis:ignore ModuleNotFoundError: No module named 'PySide' ". When i tried installing Pyside it says it is not supported in 3.6Linseylinseywoolsey
Yes it should work on Python 3.6, and I just tested with Python 3.7.4 (64-bit). Looking the setup.py of the package it should have no dependencies to Pyside or any other packages. Are you sure that the paste command is trying to use Pyside?Harriet
Yes, paste command is looking for Pyside and as Pyside only supports upto python 3.4 it gives errorLinseylinseywoolsey
It seems to be the most simple solution for WSL with python3.6Gastric
I used pip to install clipboard package which only has one line from pyperclip import copy, paste LOL. pyperclib is the perfect solution.Doublehung
pyperclip also works on Mac and Linux too (not just Windows), which is nice.Stahl
B
30

If you don't want to install extra packages, ctypes can get the job done as well.

import ctypes

CF_TEXT = 1

kernel32 = ctypes.windll.kernel32
kernel32.GlobalLock.argtypes = [ctypes.c_void_p]
kernel32.GlobalLock.restype = ctypes.c_void_p
kernel32.GlobalUnlock.argtypes = [ctypes.c_void_p]
user32 = ctypes.windll.user32
user32.GetClipboardData.restype = ctypes.c_void_p

def get_clipboard_text():
    user32.OpenClipboard(0)
    try:
        if user32.IsClipboardFormatAvailable(CF_TEXT):
            data = user32.GetClipboardData(CF_TEXT)
            data_locked = kernel32.GlobalLock(data)
            text = ctypes.c_char_p(data_locked)
            value = text.value
            kernel32.GlobalUnlock(data_locked)
            return value
    finally:
        user32.CloseClipboard()

print(get_clipboard_text())
Berns answered 25/4, 2014 at 5:54 Comment(5)
This doesn't seem to work on Windows 10. It always prints "None".Overact
Windows 10 worked fine for me as long as I used Python 32-bit. I updated the answer to work with 64-bit as well.Berns
go this error "expected char pointer, got int" on the line "text = ctypes.c_char_p(data_locked)", any idea?Dry
It would be great to see similar solution to copy text to the clipboard too.Hubbell
any tips on enumerating additional available clipboard formats? Perhaps getting binary/file data?Teston
D
23

I've seen many suggestions to use the win32 module, but Tkinter provides the shortest and easiest method I've seen, as in this post: How do I copy a string to the clipboard on Windows using Python?

Plus, Tkinter is in the python standard library.

Doodlebug answered 7/11, 2011 at 16:27 Comment(2)
Some code that will get the clipboard value via Tkinter: from Tkinter import Tk [\nl] r = Tk() [\nl] result = r.selection_get(selection = "CLIPBOARD") [\nl] r.destroy()Nieman
It's certainly easy, but it may change the window focus momentarily causing window flicker. It's probably worth coding for win32clipboard if it's available, falling back to Tkinter if not.Drennen
C
14

The most upvoted answer above is weird in a way that it simply clears the Clipboard and then gets the content (which is then empty). One could clear the clipboard to be sure that some clipboard content type like "formated text" does not "cover" your plain text content you want to save in the clipboard.

The following piece of code replaces all newlines in the clipboard by spaces, then removes all double spaces and finally saves the content back to the clipboard:

import win32clipboard

win32clipboard.OpenClipboard()
c = win32clipboard.GetClipboardData()
win32clipboard.EmptyClipboard()
c = c.replace('\n', ' ')
c = c.replace('\r', ' ')
while c.find('  ') != -1:
    c = c.replace('  ', ' ')
win32clipboard.SetClipboardText(c)
win32clipboard.CloseClipboard()
Colonic answered 19/6, 2012 at 8:0 Comment(0)
L
13

The python standard library does it...

try:
    # Python3
    import tkinter as tk
except ImportError:
    # Python2
    import Tkinter as tk

def getClipboardText():
    root = tk.Tk()
    # keep the window from showing
    root.withdraw()
    return root.clipboard_get()
Lynellelynett answered 4/4, 2018 at 8:42 Comment(2)
Thanks, works for me without needing to use 3rd party packages.Formation
Nice solution. Better root.quit() somewhere if we don't need the Tk GUI.Blarney
C
6

For my console program the answers with tkinter above did not quite work for me because the .destroy() always gave an error,:

can't invoke "event" command: application has been destroyed while executing...

or when using .withdraw() the console window did not get the focus back.

To solve this you also have to call .update() before the .destroy(). Example:

# Python 3
import tkinter

r = tkinter.Tk()
text = r.clipboard_get()
r.withdraw()
r.update()
r.destroy()

The r.withdraw() prevents the frame from showing for a milisecond, and then it will be destroyed giving the focus back to the console.

Coverdale answered 17/1, 2015 at 1:8 Comment(0)
F
4

Use Pythons library Clipboard

Its simply used like this:

import clipboard
clipboard.copy("this text is now in the clipboard")
print clipboard.paste()  
Footstall answered 27/4, 2016 at 10:19 Comment(5)
This is essentially using pyperclip. The entire source code of this module is literally: from pyperclip import copy, paste.Bracci
it's true. However they are right that clipboard is a better name. This function should be included in Python standard library.Voorhees
this kind of package is just a shame... with one line of code that just uses another package...Formation
import pyperclip as clipboardOverseas
@Formation It's also kinda funny if you think about it... Maybe they used the pyperclip module to copy some code to the clipboard in order to make the clipboard module with!Mandrel
Z
3

Try win32clipboard from the win32all package (that's probably installed if you're on ActiveState Python).

See sample here: http://code.activestate.com/recipes/474121/

Zetes answered 19/9, 2008 at 11:15 Comment(0)
D
3
import pandas as pd
df = pd.read_clipboard()
Devora answered 7/12, 2021 at 4:21 Comment(1)
This works best for me as I already have a dependency on Pandas. The implementation behind this resides in pandas.io.clipboard.clipboard_get(), which is more useful if you need text without parsing it.Ormolu
D
3

Why not try calling powershell?

import subprocess

def getClipboard():
    ret = subprocess.getoutput("powershell.exe -Command Get-Clipboard")
    return ret
Derwood answered 18/2, 2022 at 5:36 Comment(1)
Wow, I didn't know we can do that, just like on Linux and the like, the best solution for me!Eucalyptus
R
2

After whole 12 years, I have a solution and you can use it without installing any package.

from tkinter import Tk, TclError
from time import sleep

while True:
    try:
        clipboard = Tk().clipboard_get()
        print(clipboard)
        sleep(5)
    except TclError:
        print("Clipboard is empty.")
        sleep(5)
Retrocede answered 29/4, 2021 at 19:17 Comment(0)
S
1

A not very direct trick:

Use pyautogui hotkey:

Import pyautogui
pyautogui.hotkey('ctrl', 'v')

Therefore, you can paste the clipboard data as you like.

Salinasalinas answered 9/7, 2019 at 7:6 Comment(1)
He asked for how to read it, not paste itBobstay
R
1

For users of Anaconda: distributions don't come with pyperclip, but they do come with pandas which redistributes pyperclip:

>>> from pandas.io.clipboard import clipboard_get, clipboard_set
>>> clipboard_get()
'from pandas.io.clipboard import clipboard_get, clipboard_set'
>>> clipboard_set("Hello clipboard!")
>>> clipboard_get()
'Hello clipboard!'

I find this easier to use than pywin32 (which is also included in distributions).

Rubefaction answered 6/12, 2021 at 16:14 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.