Seite 1 von 1

if not in / String erwartet

Verfasst: Dienstag 31. März 2020, 22:49
von Raketenwurm
Hi......

Ich habe folgendes Problem und verstehe es nicht......

Ziel ist es ein simples Skript zu erstellen welches einfach aus der Zwischenablage den inhalt ausliest und dann von den zeichen '!()-[]{};:'"\,<>./?@#$%^&*_~ befreit.
Aber IDLE meckert jedesmal über die "If Char in" Zeile.... Wenn ich allerdings nicht den String aus der Zwischenablage nehme sondern manuell per "Input()" einen String erzeuge gehts......

Kann mir da jemand helfen?

Code: Alles auswählen

import ctypes
import string
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()
s = get_clipboard_text()



punctuations = '''!()-[]{};:'"\,<>./?@#$%^&*_~'''
input_str = s
print (s)
final_str = ""
for char in input_str:
    if char not in punctuations:
        final_str += char
 
print(final_str)
Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "G:\Zwischenablage .py", line 33, in <module>
    if char not in punctuations:
TypeError: 'in <string>' requires string as left operand, not int
Dankesehr.

Re: if not in / String erwartet

Verfasst: Dienstag 31. März 2020, 23:04
von __deets__
Du hast einen bytestring. Darüber zu iterieren liefert in Python 3 ints. Eine in meinen Augen verfehlte Designentscheidung. Du musst den String also erstmal korrekt dekodieren.

Re: if not in / String erwartet

Verfasst: Dienstag 31. März 2020, 23:24
von Raketenwurm
__deets__ hat geschrieben: Dienstag 31. März 2020, 23:04 Du hast einen bytestring. Darüber zu iterieren liefert in Python 3 ints. Eine in meinen Augen verfehlte Designentscheidung. Du musst den String also erstmal korrekt dekodieren.
Ahh - dankeschön - das macht dann allerdings Sinn..

Und wie stelle ich das am besten an? :oops:

Re: if not in / String erwartet

Verfasst: Mittwoch 1. April 2020, 08:09
von Sirius3
Am besten, indem Du schon ein fertiges Paket zum Umgang mit der Zwischenablage installierst, und nicht versuchst, das selbst zu machen.
CF_TEXT liefert ANSI-codierten Text, normalerweise möchte man wohl aber CF_UNICODETEXT, der müßte UTF16-kodiert sein. Ich sehe gerade, bei c_wchar_p decodiert ctypes automatisch.

Re: if not in / String erwartet

Verfasst: Sonntag 12. April 2020, 19:57
von Raketenwurm
Ok. habe es nun teilweise gelöst:

Code: Alles auswählen

import clipboard
import string
import time

total = 1

while True:

	punctuations = '''!-[]{};:'"\,<>./?@#$%^&*~'''
	input_str = clipboard.paste()
	if input_str == "":
		print("Zwischenablage ist leer")

	final_str = ""
	for char in input_str:
		if char not in punctuations:
			final_str += char
 
	print(total,";",final_str.replace("\n"," ")[:79])
	print("")	
	print("======================================")
	print("")

	clipboard.copy(final_str)
	total += 1
	
	while final_str == clipboard.paste():
		time.sleep(1)  


nur ich möchte dass nur eine Zeile mit max 79 Zeichen ausgegeben werden, egal wieviel ich tatsächlich kopiert habe. Der "final_str" soll aber von der max79-Zeichen ausgabe nicht angetastet werden.

Aber irgendwie funktioniert es nicht ganz so wie ich möchte, denn meist bekomme ich trotzdem noch eine zweite Zeile angezeigt.
Der text in der Zwischenablage ist soweit in Ordnung.

Was könnte hier mein Fehler sein?

Re: if not in / String erwartet

Verfasst: Sonntag 12. April 2020, 20:20
von Sirius3
String wird importiert, aber nicht benutzt. \, ist in Punktation wohl nicht das, was Du meinst.
Um Zeichen zu ersetzen, gibt es `translate`.

Code: Alles auswählen

import clipboard
import time
from itertools import count

TRANSLATIONS = dict.fromkeys(map(ord, '''!-[]{};:'"\\,<>./?@#$%^&*~'''))
TRANSLATIONS[ord('\n')] = ' '

previous_input = None
for total in count(1):
    while True:
        input_text = clipboard.paste()
        if previous_input != input_text:
            break
        time.sleep(1)
    previous_input = input
    if not input_text:
        print("Zwischenablage ist leer")
    else:    
        final_text = input_text.translate(TRANSLATIONS)
        print(f"{total};{final_text:.79s}")
        clipboard.copy(final_text)
Was meinst Du mit "zweite Zeile"? Beispiel?

Re: if not in / String erwartet

Verfasst: Sonntag 12. April 2020, 21:15
von Raketenwurm
na ich meinte es sollte nur eine Zeile mit max. 79 Zeilen ausgegeben werden - also ohne Zeilenumbruch

Re: if not in / String erwartet

Verfasst: Montag 13. April 2020, 21:35
von Raketenwurm
Raketenwurm hat geschrieben: Sonntag 12. April 2020, 21:15 na ich meinte es sollte nur eine Zeile mit max. 79 Zeilen ausgegeben werden - also ohne Zeilenumbruch
meinte natürlich es sollte nur eine Zeile mit max. 79 Zeichen ausgegeben werden - also ohne Zeilenumbruch
und alle weiteren Zeichen sollen abgeschnitten werden

Re: if not in / String erwartet

Verfasst: Dienstag 14. April 2020, 20:28
von Raketenwurm
So Problem gelöst:

Code: Alles auswählen

import clipboard
import string
import time

total = 1

while True:

	punctuations = '''!-[]{};:'"\,<>./?@#$%^&*~'''
	input_str = clipboard.paste()
	if input_str == "":
		print("Zwischenablage ist leer")

	final_str = ""
	for char in input_str:
		if char not in punctuations:
			final_str += char
 
	printstr = final_str.replace("\n"," ")
	printstr = printstr.replace("\r"," ")
	print(total,";",printstr[:79])
	print("")	
	print("======================================")
	print("")

	clipboard.copy(final_str)
	total += 1
	
	while final_str == clipboard.paste():
		time.sleep(1) 
kann man folgende zeilen auch zu einer zusammenfassen?:

Code: Alles auswählen

	printstr = final_str.replace("\n"," ")
	printstr = printstr.replace("\r"," ")