String durchsuchen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

achim55 hat geschrieben:Wie kann ich das den jetzt "geradebiegen" das der imapclient unter 3.5 installiert wird?
Mehrere Python Versionen nebeneinander sind auch auf dem Mac kein Problem. Du solltest mit Virtuellen Environments arbeiten. Lege Dir eins für Python 3.5 an und installiere von dort aus per pip was Du braucht.
https://docs.python.org/3/using/scripts ... ght=pyvenv
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Oder alternativ:

Code: Alles auswählen

pip3 install imapclient
Wenn das nicht geht:

Code: Alles auswählen

python3 -m pip install imapclient
achim55
User
Beiträge: 14
Registriert: Donnerstag 11. Februar 2016, 20:21

so langsam kommen wir der Sache näher :-)
Es klappte mit: python3 -m pip install imapclient

Ich bekomme eine Fehlermeldung beim ausführen :(
Traceback (most recent call last):
File "<pyshell#14>", line 1, in <module>
print('%d messages in INBOX' % select_info['EXISTS'])
KeyError: 'EXISTS'
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Jetzt müsste man nur noch wissen, wie `select_info` zustande gekommen ist.

Bitte mal ein Minimalbeispiel posten, welches das Problem demonstriert (also mit Import und Funktionsaufrufen).
achim55
User
Beiträge: 14
Registriert: Donnerstag 11. Februar 2016, 20:21

ok, hier der Aufruf.

Code: Alles auswählen

from __future__ import unicode_literals
from imapclient import IMAPClient

HOST = 'imap.host.com'
USERNAME = 'someuser'
PASSWORD = 'secret'
ssl = False

server = IMAPClient(HOST, use_uid=True, ssl=ssl)
server.login(USERNAME, PASSWORD)

select_info = server.select_folder('INBOX')
print('%d messages in INBOX' % select_info['EXISTS'])
Zuletzt geändert von Anonymous am Freitag 19. Februar 2016, 19:49, insgesamt 1-mal geändert.
Grund: Quelltext in Code-Tags gesetzt.
BlackJack

Was enthält `select_info` denn stattdessen so alles?
achim55
User
Beiträge: 14
Registriert: Donnerstag 11. Februar 2016, 20:21

Hallo,
jetzt zeigt er mir alle Mails an. Habe b'EXISTS' genommen.

Gehe ich recht in der Annahme das ich ein "search(criteria=u'UNSEEN', charset=None)" einbauen muss,
damit er mir nur die Anzahl der ungelesenen Mails anzeigt ?


print (select_info)
{b'UIDVALIDITY': 1426254117, b'READ-WRITE': True, b'RECENT': 0, b'MYRIGHTS': [b'"acdilrsw"'], b'PERMANENTFLAGS': (b'$MailFlagBit0', b'$MailFlagBit1', b'$NotJunk', b'$Forwarded', b'NotJunk', b'\\*', b'\\Draft', b'\\Answered', b'\\Flagged', b'\\Deleted', b'\\Seen'), b'EXISTS': 293, b'FLAGS': (b'$MailFlagBit0', b'$MailFlagBit1', b'$NotJunk', b'$Forwarded', b'NotJunk', b'\\Draft', b'\\Answered', b'\\Flagged', b'\\Deleted', b'\\Seen', b'\\Recent')}
BlackJack

@achim55: Du musst halt den richtigen Schlüssel für den Zugriff wählen. b'EXISTS' != 'EXISTS'. Bitte über den Unterschied und den Zusammenhang zwischen Bytes und Zeichenketten informieren. Der ist sehr wichtig. :-)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dazu kannst Du mal einen Blick in meine Signatur werfen :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
achim55
User
Beiträge: 14
Registriert: Donnerstag 11. Februar 2016, 20:21

Ich weiß ...ich weiß :)
Bin ja am lernen und kann nun mal besser lernen wenn ich ein Projekt anfange.

Zu meiner Zeit war "Englisch" noch kein so großes Thema wie es heute ist. Deswegen komme ich mit vielen Anleitungen auf Englisch nicht so gut klar, und frage hier nach :)

Viele die, wie ich, auf die 60 zu gehen würden sich andere Hobbys suche die einfacher sind :D :D

Also Burschen, greift mir doch mal etwas unter die Arme oder gebt mir konkrete Hilfestellungen wie ich was
machen soll 8) 8)


Gruß
Achim
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

achim55 hat geschrieben:Viele die, wie ich, auf die 60 zu gehen würden sich andere Hobbys suche die einfacher sind :D
Dann herzlichen Glückwunsch zu diesem schönen Hobby. Geh' doch mal zu Usergroups oder zu einem Barcamp. Da kannst Du Dich auch prima auf deutsch unterhalten und Fragen stellen. Und das "programmierenglisch" ist nicht so schwer - einfach weiter einlesen, dann kommt das schon.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

achim55 hat geschrieben: Also Burschen, greift mir doch mal etwas unter die Arme oder gebt mir konkrete Hilfestellungen wie ich was
machen soll 8) 8)
Das Thema Encoding und Unicode ist leider alles andere als "leichtgewichtig" - zumindest je nach Tiefe des Verständnisses. Iirc habe ich aber nicht nur englische Seiten verlinkt...

Du musst Dich da einfach einlesen und parallel Dinge ausprobieren - so schwer ist es letztlich nicht :-)

Wichtigstes Grundwissen ist eigentlich:
  • Unicode != UTF-8, UTF-16 usw.
  • Bei Python3 sind alle Strings Unicode-Objekte
  • Alles an Zeichen was irgend wie in Dein Programm rein kommt, ist *kein* Unicode, sondern sind *codierte* Strings. Seien es die Literale im Code (also z.B. so etwas ``text = "Hallo Welt!"``), oder Texte aus Dateien oder aus einer Datenbank oder von einem Webservice usw.
  • Immer wenn Zeichenketten in Dein Programm rein kommen, musst Du diese *decodieren*, um sie als Strings zu verwenden, also z.B. durch Angabe des Encodings bei ``open`` zum Einlesen von Textdateien. (Außer bei String-Literalen im Programmcode, bei denen das *automatisch* durch den Interpreter erledigt wird; wenn Deine Quelldatei anders als in UTF-8 vorliegt, musst Du dem Interpreter das sagen per ``# -*- coding: latin-1 -*-`` ganz oben im Script direkt nach einem Shebang).
  • Immer wenn Du Zeichen aus Deinem Programm herausgibst, musst Du diese *encodieren*, also von Unicode in eine gängige Zeichencodierung wandeln. Dies gilt auch für ``print`` - leider kann man diesem kein Encoding übergeben, sondern Python wählt iirc immer das Default Encoding für Shells des OS. Saudumme Designentscheidung und echt *nervig*. Strings haben die ``encode``-Methode, mit denen man das Wandeln in Bytes vornehmen kann.
  • Als Grundregel kannst Du Dir merken: Immer so früh wie möglich *decodieren* und so spät wie möglich *encodieren*. Mit codierten Bytes solltest Du nur arbeiten, wenn das für die Domäne besser ist, in der Du dich bewegst.
Bei Python2 verhält es sich ein wenig anders, weil bei diesem String-Objekte sowohl Unicode als auch codierte Bytes enthalten können. Aber auch dort gelten die meisten Anmerkungen in ähnlicher Form.

Habe ich etwas vergessen? Ich hoffe nichts wesentliches :-)

Einen guten Überblick über Terminologien gibt imho die Seite utf8everywhere; auch wenn es auf Englisch ist, sollte der Abschnitt leicht verständlich sein.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Hyperion: Die Bemerkung zu Python 2 ist IMHO unglücklich formuliert. Es gibt ”Zeichenketten” die Bytes (eventuell kodierten Text) enthalten (`str`) und ”echte” Unicode-Zeichenketten die Zeichen enthalten (`unicode`). Also letztlich genau wie in Python 3 wo die Datentypen `bytes` und `str` statt `str` und `unicode` heissen.
achim55
User
Beiträge: 14
Registriert: Donnerstag 11. Februar 2016, 20:21

Habe heute mal wieder etwas Zeit gefunden um weiter zu machen :)

Dann werde ich mich mal mit Unicode beschäftigen :D
Antworten