Mensajes: 5 
	Temas: 1 
	Registro en: Sep 2017
	
 Reputación: 
 0
	 
 
	
	
		Estimados todos. Intento encontrar alguna opción que me permita cargar los datos del clipboard a una tabla o a un diccionario Python. Con el módulo Tk, se podría hacer esto?. 
Al utilizar el comando "clip_text = root.clipboard_get()" qué obtengo, ¿una tabla? ¿un texto con todas las líneas y valores de las dos columnas? 
Saludos cordiales
	 
	
	
	
	
 
 
	
	
	
		
	Mensajes: 1.308 
	Temas: 3 
	Registro en: Feb 2016
	
 Reputación: 
 71
	 
 
	
	
		Hola, ¿cómo estás? 
 
Por defecto la función clipboard_get retorna el contenido del portapapeles como una cadena. Eso no quiere decir que no pueda ser analizado y restructurado como un diccionario o alguna otra colección de Python. ¿Qué es exactamente lo que esperas que haya en el portapapeles? ¿Podrías dejar un ejemplo? 
 
Saludos
	 
	
	
	
	
 
 
	
	
	
		
	Mensajes: 74 
	Temas: 12 
	Registro en: Aug 2017
	
 Reputación: 
 4
	 
 
	
		
		
		09-09-2017, 09:02 PM 
(Última modificación: 09-09-2017, 09:15 PM por calvicius.)
		
	 
	
		clipboard_get() parece que devuelve siempre una string, según las pruebas que he verificado, lo que hace dificil su manipulación: 
edito: 
Hay una libreria llamada pyperclip, pero solo maneja texto plano:
 https://pypi.python.org/pypi/pyperclip
Código: from tkinter import * 
 
root = Tk() 
# evitamos que se muestre la ventana 
root.withdraw() 
mi_cadena = "Esto es mi cadena" 
root.clipboard_clear() 
# envio mi_cadena al clipboard 
root.clipboard_append(mi_cadena) 
# recogemos el texto del clipboard 
clip_texto = root.clipboard_get() 
print(clip_texto) 
print(type(clip_texto)) 
""" 
La salida será: 
Esto es mi cadena 
<class 'str'> 
""" 
# ahora probamos con una tupla 
mi_tupla = 'Esta ', 'es ', 'mi ','tupla', 
print(type(mi_tupla)) 
root.clipboard_clear() 
# envio mi_tupla al clipboard 
root.clipboard_append(mi_tupla) 
# recogemos el texto del clipboard 
clip_tupla = root.clipboard_get() 
print(clip_tupla) 
print(type(clip_tupla)) 
""" 
La salida de este pedazo da como salida: 
<class 'tuple'> 
{Esta } {es } {mi } tupla 
<class 'str'> 
""" 
# parece que aunque asignemos una tupla, clipboard_get() 
# retorna una cadena donde cada elemento de la tupla lo encierra 
# entre llaves, pero no es un diccionaro 
# print(clip_tupla[0]) nos retorna una simple { 
 
# ahora probamos con una lista: 
mi_lista = ['Esta ', 'es ', 'mi ','lista'] 
print(type(mi_lista)) 
root.clipboard_clear() 
# envio mi_lista al clipboard 
root.clipboard_append(mi_lista) 
# recogemos el texto del clipboard 
clip_lista = root.clipboard_get() 
print(clip_lista) 
print(type(clip_lista)) 
""" 
con la lista pasa lo mismo: 
<class 'list'> 
{Esta } {es } {mi } lista 
<class 'str'> 
""" 
 
# por ultimo un diccionario 
mi_diccionario = {'1':'Este ', '2':'es ', '3':'mi ', '4':'diccionario'} 
print(type(mi_diccionario)) 
root.clipboard_clear() 
# envio mi_diccionario al clipboard 
root.clipboard_append(mi_diccionario) 
# recogemos el texto del clipboard 
clip_diccionario = root.clipboard_get() 
print(clip_diccionario) 
print(type(clip_diccionario)) 
""" 
aqii tambien retorna una str: 
<class 'dict'> 
{'1': 'Este ', '2': 'es ', '3': 'mi ', '4': 'diccionario'} 
<class 'str'> 
""" 
# ahora añado al clipboar las cuatro variables 
root.clipboard_clear() 
root.clipboard_append(mi_cadena) 
root.clipboard_append(mi_tupla) 
root.clipboard_append(mi_lista) 
root.clipboard_append(mi_diccionario) 
clip_resumen = root.clipboard_get() 
print(clip_resumen) 
print(type(clip_resumen)) 
""" 
me suelta esto del tirón: 
Esto es mi cadena{Esta } {es } {mi } tupla{Esta } {es } {mi } lista{'1': 'Este ', '2': 'es ', '3': 'mi ', '4': 'diccionario'} 
<class 'str'> 
"""
  
	 
	
	
	
	
 
 
	
	
	
		
	Mensajes: 5 
	Temas: 1 
	Registro en: Sep 2017
	
 Reputación: 
 0
	 
 
	
	
		Gracias a todos por la ayuda. 
Tengo un Libro Excel con muchas hojas. En cada hoja, entre otras muchas cosas, hay un rango de datos (dos columnas: fecha y número)(pueden llegar a ser del orden de 3000 filas), que quiero capturar en Python para analizarlos.  Intentar leerlos directamente de la hoja con por ejemplo openpyxl, me resulta complicado y lento. 
 
Por ello he pensado que si consigo desarrollar un script que, si tengo algo en el portapapeles, al ejecutarlo lo importa a una tabla o a un diccionario, ésta opción me resultaría mucho más eficiente. De ahí mi pregunta. 
¿Se os ocurre alguna opción?. 
Saludos cordiales
	 
	
	
	
	
 
 
	
	
	
		
	Mensajes: 5 
	Temas: 1 
	Registro en: Sep 2017
	
 Reputación: 
 0
	 
 
	
	
		Estimados todos, con Tk consigo un strig. 
# !/usr/bin/env python 
 
# -*- coding: utf-8 -*- 
 
try: 
    # Python2 
    import Tkinter as tk 
except ImportError: 
    # Python3 
    import tkinter as tk 
root = tk.Tk() 
 
# text from clipboard 
clip_text = root.clipboard_get() 
#print(clip_text)  # --> Donnerwetter 
print (clip_text) 
print (type(clip_text)) 
 
como este 
20/07/17    2,00 
19/07/17    177,90 
18/07/17    177,64 
17/07/17    177,50 
14/07/17    177,36 
13/07/17    176,96 
12/07/17    177,06 
11/07/17    177,90 
10/07/17    177,90 
7/07/17    178,13 
6/07/17    178,20 
5/07/17    178,01 
4/07/17    177,71 
3/07/17    177,92 
30/06/17    178,90 
29/06/17    177,88 
28/06/17    177,12 
27/06/17    177,17 
.............................. 
<type 'str'> 
 
Como podéis ver, bastante complicado para pasarlo a una lista o a un diccionario. ¿? 
Saludos cordiales 
	 
	
	
	
	
 
 
	
	
	
		
	Mensajes: 74 
	Temas: 12 
	Registro en: Aug 2017
	
 Reputación: 
 4
	 
 
	
		
		
		10-09-2017, 07:19 PM 
(Última modificación: 10-09-2017, 07:48 PM por calvicius.)
		
	 
	
		hola,  
si te sale, tal como muestras, teoricamente al final encontrarás un '\r\n' (windows), '\n' (linux), '\r' (MacOS). 
Si es asi puedes hacer algo asi como esto:
 
cadena1 = cadena.split('\n') 
 
ahora cada lemento será un  cadena[0] = '20/07/17    2,00' ...... cadena[n] = '27/06/17    177,17'; esto es cada elemento de la lista es una cadena que se puede dividir por el espacio. Por lo tanto cada elemento lo convertimos, p.ej. en una tupla (hacerlo en bucle):
 
elemento_0 = cadena[0].split('un espacio ') 
tupla_0 = (elemento_0[0], elemento_0[1])
 
lista.append(tupla_0)
 
y asi ya tendrías los datos estructurados.
 
De todas maneras, creo que lo que buscas es la libreria Pandas, la cual es una libreria de palabras mayores. Hay libros completos sobre esta libreria. Puedes encontrarlos "googleando"
 
Creo que pandas puede importar directamente las hojas de calculo comerciales que mencionas, y montar una tabla (DataFrame en pandas). Junto con otras librerias, maneja regresiones, correlaciones, varianzas, teorema de Bayes, etc...
 
edito: 
acabo de revisar unos apuntes que me pasaron hace tiempo, y creo que esto cumple tus expectativas:
 Código: import pandas as pd 
pd.read_clipboard()            # Si hemos seleccionado las cabeceras de la hoja de calculo 
pd.read_clipboard(header=None) # Si no las hemos seleccionado 
... hay mas, pero por ser breve
  
y lo que nos devuelve pandas es una tabla de datos (DataFrame)
 
sobre excel en concreto :  http://pandas.pydata.org/pandas-docs/sta...dataframes
pandas suele ir compañada de una o varias de estas librerias:
 
Numpy:  http://www.numpy.org/
SoiPy:  https://www.scipy.org/
StatsModels:  http://www.statsmodels.org/stable/index.html
scikit-learn :  http://scikit-learn.org/stable/
PyMC :https://pymc-devs.github.io/pymc/
 
Visualización gráfica:
 
matplotlib :  https://matplotlib.org/
seaborn :  https://seaborn.pydata.org/
	 
	
	
	
	
 
 
	
	
	
		
	Mensajes: 5 
	Temas: 1 
	Registro en: Sep 2017
	
 Reputación: 
 0
	 
 
	
	
		Gracias Calvicius. 
He encontrado este tutorial, y estoy buscando en el nuevas opciones.
 https://www.datacamp.com/community/tutor...gs.aw3jPF4
No descarto intentarlo con tu propuesta, aunque me plantea el problema de que, como puedes ver en la estructura de los datos de salida del script, no es uniforme en cuanto a espacios entre la fecha y los datos, ni en cuanto a la longitud de la fecha. 
Saludos cordiales
	  
	
	
	
	
 
 
	
	
	
		
	Mensajes: 74 
	Temas: 12 
	Registro en: Aug 2017
	
 Reputación: 
 4
	 
 
	
		
		
		11-09-2017, 11:44 AM 
(Última modificación: 11-09-2017, 02:08 PM por calvicius.)
		
	 
	
		 (11-09-2017, 08:02 AM)efueyo escribió:  Gracias Calvicius. 
He encontrado este tutorial, y estoy buscando en el nuevas opciones. 
https://www.datacamp.com/community/tutor...gs.aw3jPF4 
No descarto intentarlo con tu propuesta, aunque me plantea el problema de que, como puedes ver en la estructura de los datos de salida del script, no es uniforme en cuanto a espacios entre la fecha y los datos, ni en cuanto a la longitud de la fecha. 
Saludos cordiales 
de nada hombre.
 
Voy a tomar estas dos lineas de tu ejemplo: 
12/07/17    177,06 (4 espacios) 
7/07/17   178,13 (3 espacios)
 
1.- Lo de los espacios...
 
hacemos un elem.split(' ') --> 1 espacio. 
supongamos que lo hacemos sobre la cadena con 4 espacios: 
>>> cadena = "12/07/17    177,06" 
>>> elems = cadena.split(' ') 
>>> elems 
['12/07/17', '', '', '', '177,06']
 
como vemos se han creado tres elementos vacíos en la lista. Lo cual ya es fácil, bien con elems.remove("") o con elems.pop(indice)
 
Edito: 
Te pongo el ejemplo completo (pero antes comprueba que sean espacios y no tabuladores '\t', por ejemplo):
 Código: cadena = "12/07/17    177,06" 
elems = cadena.split(' ') 
 
#este es el modelo más caro en tiempo para una lista larga 
#el costo en el peor de los casos es el num. de elementos elevado al cuadrado 
elementos_validos = [] 
 
for i in range(len(elems)): 
    if elems[i] != "": 
        elementos_validos.append(elems[i]) 
         
print(elementos_validos) 
 
# mas rapido para muchos datos es: 
# podemos aprovechar que los diccionarios no admiten claves duplicadas 
# la pega es que no tiene por qué mantener el orden original de los elementos 
# el coste es el num. de elementos 
validos_dict = dict.fromkeys(elems).keys() 
print(validos_dict) 
 
# ahora tenemos un solo elemento cuya clave es "". Lo eliminamos 
lista_eliminar = list(validos_dict) 
print(lista_eliminar)   # con el elemento vacio 
lista_eliminar.remove('') 
print(lista_eliminar)   # sin el elemento vacio 
 
 
# lo mismo que con diccionarios, tambien se puede hacer con conjuntos 
# la pega es la misma que con diccionarios 
# el coste es el num. de elementos 
 
# list(set(lista_original - en este caso elems))
  
2.- Lo de las fechas...
 
import datetime 
mi_fecha = "12/07/17"
 
datetime.datetime.strptime(mi_fecha', '%d/%m/%y').date()
 
y ya tenemos la cadena fecha como un objeto fecha.
	  
	
	
	
	
 
 
	
	
	
		
	Mensajes: 5 
	Temas: 1 
	Registro en: Sep 2017
	
 Reputación: 
 0
	 
 
	
	
		Calvicius, He visto que con Pandas, puedo conseguir fácilmente un dataframe, en este ejemplo, denominado df1. 
#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
# Import pandas 
import pandas as pd 
# Assign spreadsheet filename to `file` 
file = 'pruebas.xlsx' 
# Load spreadsheet 
xl = pd.ExcelFile(file) 
# Print the sheet names 
print(xl.sheet_names) 
# Load a sheet into a DataFrame by name: df1 
df1 = xl.parse('Hoja2') 
print (df1) 
 
El siguiente paso, que no debe ser muy difícil, sería pasarlo a diccionario  utilizando la función pandas: 
DataFrame.to_dict([orient]) 
 
Esto serviría para mi propósito, pero no sé qué debo poner en "orient". 
 
Agradeceré tu ayuda, si es que lo sabes. 
Saludos cordiales
	 
	
	
	
	
 
 
	
	
	
		
	Mensajes: 74 
	Temas: 12 
	Registro en: Aug 2017
	
 Reputación: 
 4
	 
 
	
		
		
		12-09-2017, 06:28 PM 
(Última modificación: 12-09-2017, 07:27 PM por calvicius.)
		
	 
	
		sobre  DataFrame.to_dict([orient])
te remito a la página oficial:
 https://pandas.pydata.org/pandas-docs/st..._dict.html
que dice:
 
pandas.DataFrame.to_dict( orient='dict')
 
Convert DataFrame to dictionary.
 
 Parameters:
 orient : str {‘dict’, ‘list’, ‘series’, ‘split’, ‘records’, ‘index’}
 Cita:- dict (default) : dict like {column -> {index -> value}}
 
 
- list : dict like {column -> [values]}
 
 
- series : dict like {column -> Series(values)}
 
 
- split : dict like {index -> [index], columns -> [columns], data -> [values]}
 
 
- records : list like [{column -> value}, ... , {column -> value}]
 
 
- index : dict like {index -> {column -> value}}
 
New in version 0.17.0. 
 
 
Abbreviations are allowed. s indicates series and sp indicates split. 
Returns:
 result : dict like {column -> {index -> value}}
 
que segun interpreto, es el tipo de datos que vas a poner en el diccionario. orient='list' --> si es una lista, etc... 
Los diccionarios tienen clave unica. imaginemos una tabla (df) tal que asi:
 
      id     valor 
0    0      99.9 
1    1      55.5 
2    2      77.7
 
dataframe.set_index('id').to_dict()
 
y si la tabla tuviese un solo valor:
 
dataframe.set_index('id')['valor'].to_dict()
 
pero tienes que tener en cuenta que en tu ejemplo pueden haber datos duplicados, los cuales en este caso se perderían los duplicados. Quizas te interese pasarlo a una lista de tuplas, siendo cada tupla una fila o columna (segun elijas) 
 
dataframe = pandas.DataFrame([[1,2,3],[3,4,5]]) 
resultado_lista = dataframe.values.tolist() 
 
o bien:
 
resultado = df.values
 
o bien:
 
df.values.flatten()
 
etc...
 
Nota: esta libreria hay que leerla en serio. Mira aqui:  Libros sobre Pandas
	 
	
	
	
	
 
 
	 
 |