if not in / String erwartet

Code-Stücke können hier veröffentlicht werden.
Antworten
Raketenwurm
User
Beiträge: 6
Registriert: Dienstag 31. März 2020, 22:34

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.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Raketenwurm
User
Beiträge: 6
Registriert: Dienstag 31. März 2020, 22:34

__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:
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Raketenwurm
User
Beiträge: 6
Registriert: Dienstag 31. März 2020, 22:34

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?
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

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?
Raketenwurm
User
Beiträge: 6
Registriert: Dienstag 31. März 2020, 22:34

na ich meinte es sollte nur eine Zeile mit max. 79 Zeilen ausgegeben werden - also ohne Zeilenumbruch
Raketenwurm
User
Beiträge: 6
Registriert: Dienstag 31. März 2020, 22:34

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
Raketenwurm
User
Beiträge: 6
Registriert: Dienstag 31. März 2020, 22:34

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"," ")
Antworten