Seite 1 von 2

FTP Ordner auf SynoDS Erstellen mit Umlaute

Verfasst: Sonntag 7. März 2021, 23:05
von Kalysto
Hallo zusammen,

Ich habe ein Problem....
Ich habe folgendes code bsp.:

Code: Alles auswählen

self.subDirCustomer_Prüfungen = 'Prüfungen'
self.cur.encoding = 'utf-8'
self.cur.mkd(self.subDirCustomer_Prüfungen)
Trotzdem das ich den encoding gesetzt habe gibt er mir bzw. erstellt er mir folgenden Ordnernamen:

Code: Alles auswählen

 Prüfungen
Weis einer zufällig wie ich das beheben kann.....
Ich weis nicht was ich noch versuchen sollte..:(

Mit freundlichen Grüßen
Kalysto

Re: FTP Ordner auf SynoDS Erstellen mit Umlaute

Verfasst: Sonntag 7. März 2021, 23:46
von __blackjack__
@Kalysto: Dann ist offensichtlich UTF-8 die falsche Kodierung. Es sieht so aus als wenn die Defaultkodierung ("latin-1") schon die richtige gewesen wäre. Oder was ist damit das Problem?

Re: FTP Ordner auf SynoDS Erstellen mit Umlaute

Verfasst: Montag 8. März 2021, 05:58
von Kalysto
@__blackjack__ Das versteh ich nun nicht....
Ich dachte utf-8 wäre für Umlaute und die ganzen Sonderzeichen.... wieso geht es nun wenn ich die Codierung utf-8 weg lasse...
Könntest du das erläutern ?

Und vielen dank für den Tipp xD

Re: FTP Ordner auf SynoDS Erstellen mit Umlaute

Verfasst: Montag 8. März 2021, 06:24
von Sirius3
Dem FTP-Server ist es völlig Wurst was du als Encoding im Client einstellst, der verarbeitet die Bytes, die er bekommt, mit seinem Encoding. Daher musst du bei dir genau das einstellen.

Re: FTP Ordner auf SynoDS Erstellen mit Umlaute

Verfasst: Montag 8. März 2021, 11:27
von Kalysto
Verstehen muss ich’s dennoch nicht :roll:

Es geht und das passt :D

Re: FTP Ordner auf SynoDS Erstellen mit Umlaute

Verfasst: Montag 8. März 2021, 20:18
von Kalysto
Nochmal eine frage zu einem ähnlichen Problem....

Das erstellen von Ordnern mit umlauten klappt nun wunderbar aber wenn ich diese löschen möchte mit folgendem code:

Code: Alles auswählen

for n in self.cur.nlst(self.subDirCustomer_Eintragungen):
	self.cur.delete(n)
bekomme ich immer folgende Meldung:

Code: Alles auswählen

550 Materiallisten/Test 1/Eintragungen/Prüfvorlage DGUV V3.xlsx: No such file or directory.
wenn ich aber nun den code:

Code: Alles auswählen

self.cur.delete('Materiallisten/Test 1/Eintragungen/Prüfvorlage DGUV V3.xlsx')
ausführe geht es ohne Probleme....
woran kann das nun wieder liegen ^^

Re: FTP Ordner auf SynoDS Erstellen mit Umlaute

Verfasst: Montag 8. März 2021, 20:41
von __blackjack__
@Kalysto: Das kann am FTP-Server liegen, oder an `ftplib`.

Was enthält denn `n` genau? Was wird ausgegeben wenn Du ``print(ascii(n)`` in die Schleife setzt?

Re: FTP Ordner auf SynoDS Erstellen mit Umlaute

Verfasst: Montag 8. März 2021, 21:23
von Kalysto
@__blackjack__,

`n` sollte und hat den Pfad der Datei:

Code: Alles auswählen

 Materiallisten/Test 1/Eintragungen/Prüfvorlage DGUV V3.xlsx
Und zu deiner Frage das wäre die Ausgabe vom print:

Code: Alles auswählen

 Materiallisten/Test 1/Eintragungen/Pr\xc3\xbcfvorlage DGUV V3.xlsx

Re: FTP Ordner auf SynoDS Erstellen mit Umlaute

Verfasst: Montag 8. März 2021, 22:03
von __blackjack__
@Kalysto: Die Ausgabe ist nicht vollständig, und das was fehlt ist wichtig.

Re: FTP Ordner auf SynoDS Erstellen mit Umlaute

Verfasst: Montag 8. März 2021, 22:09
von Kalysto
@__blackjack__,
Ich hatte eig. Nur die ‘ weggelassen...
'Materiallisten/Test 1/Eintragungen/Pr\xc3\xbcfvorlage DGUV V3.xlsx'
Mehr ist da nicht mehrere Ordner und Dateien ja aber sonst nichts..

Was würde denn fehlen ?

Re: FTP Ordner auf SynoDS Erstellen mit Umlaute

Verfasst: Montag 8. März 2021, 22:42
von __blackjack__
@Kalysto: Ja eben die ' haben gefehlt. Daran kann man sehen das es eine Zeichenkette ist und kein Bytes-Objekt und das da *nicht* Prüfvorlage drin steht sondern Prüfvorlage. Was ziemlich wahrscheinlich falsch ist.

Re: FTP Ordner auf SynoDS Erstellen mit Umlaute

Verfasst: Dienstag 9. März 2021, 05:51
von Kalysto
@__blackjack__,

Okay sry das nächste mal weis ich’s.
Also das könnte ich umgehen indem ich die Code Zeile:

Code: Alles auswählen

ftp.encoding = "utf-8"
Hinzufügen würde..
Aber das ändert nichts an der fehlerausgabe:

Code: Alles auswählen

550 Materiallisten/Test 1/Eintragungen/Prüfvorlage DGUV V3.xlsx: No such file or directory.

Re: FTP Ordner auf SynoDS Erstellen mit Umlaute

Verfasst: Mittwoch 10. März 2021, 23:11
von Kalysto
Keiner eine idee ? ;(

Re: FTP Ordner auf SynoDS Erstellen mit Umlaute

Verfasst: Donnerstag 11. März 2021, 00:10
von __blackjack__
@Kalysto: Da müsstest Du Dich mit Kodierungen auseinandersetzen und schauen wie die Werte jeweils an den verschiedenen Punkten zwischen Quelle und Ziel kodiert sind und de- und enkodiert werden und die Stelle identifizieren an der das dann falsch läuft.

Kann auch sein, dass es halt einfach nicht geht. FTP ist nicht wirklich gut spezifiziert und aus einer Zeit als es ASCII gab und alle ausserhalb von Amerika sich damit abgefunden haben das man so superexotische Sachen wie Umlaute besser nicht verwendet.

Re: FTP Ordner auf SynoDS Erstellen mit Umlaute

Verfasst: Donnerstag 11. März 2021, 05:53
von Kalysto
Ja das komische ist ja aber wenn ich den Pfad direkt angebe also manuell geht es ja...

Nur wenn ich es über die Funktion abrufe nich...

Wenn eben beides nicht gehen würde wäre und fände ich es logischer aber so...

Muss ich nochmal schauen und ansonsten aufgeben ^^

Re: FTP Ordner auf SynoDS Erstellen mit Umlaute

Verfasst: Donnerstag 11. März 2021, 07:07
von ThomasL
oder halt Umlaute nicht verwenden oder auf vorhandene prüfen und äöü durch ae oe ue etc ersetzen. Nur so als Idee. Wer braucht deutsche Umlaute?

Re: FTP Ordner auf SynoDS Erstellen mit Umlaute

Verfasst: Donnerstag 11. März 2021, 07:25
von Sirius3
@Kalysto: zeig doch mal Deinen kompletten Code. Ich vermute mal, Du änderst nachträglich das Encoding, was man aber nicht machen darf, weil es sonst zu Inkonsistenzen kommt.

Re: FTP Ordner auf SynoDS Erstellen mit Umlaute

Verfasst: Donnerstag 11. März 2021, 17:57
von Kalysto
Ja klar kann ich machen hier:

Code: Alles auswählen

# Hier erstelle ich mir meine FTP Verbindung
	def Synology_DS718(self, customer):
		try:
			ip = 'xxx.xxx.xxx.xxx'
			port = xxxx
			user = 'xxxx'
			pwd = 'xxxxx'
			
			ftp = FTP_TLS()
			ftp.ssl_version = ssl.PROTOCOL_TLSv1_2
			ftp.connect(ip, port)
			#ftp.encoding = 'utf-8'
			#ftp.encoding = 'latin-1'
			ftp.login(user, pwd)
		except ftplib.all_errors as e:
			print(f'Error connecting to FTP-Server:\n{e}')

		self.cur = ftp
		
	def createCustomerDirs__FTP(self):
		self.Synology_DS718(self.Customer)
		try:
			decontrol = None
			for f in self.cur.nlst(self.mainDirCustomer__CONFIG):
				if f == self.subDirCustomer__CUSTOMER:
					decontrol = True
					break
			if decontrol is True:
				if self.removeCustomerDir__CONFIG == 'True':
					pass
				if self.removeMateriallistDir__CONFIG == 'True':
					# Als Erläuterung:
					# self.subDirCustomer_Materiallisten = '01_Kunde'
					# self.Customer_Project = 'Kunden Projekt Name'
					# self.subDirCustomer_Materiallisten__CUSTOMER = '01_Kunde/Kunden Projekt Name'

					self.subDirCustomer_Materiallisten__CUSTOMER = '%s/%s' % (self.subDirCustomer_Materiallisten, self.Customer_Project)
					
					# Hier wird die Datei ohne Probleme gelöscht
					#self.cur.delete('01_Kunde/Kunden Projekt Name/Materiallisten/Test 1/Eintragungen/Prüfvorlage DGUV V3.xlsx')

					# Hier wird sie nicht mehr gelöscht
					for f_main in self.cur.nlst(self.subDirCustomer_Materiallisten__CUSTOMER):
						try:
							self.cur.delete(f_main)
						except:
							for f_sub in self.cur.nlst(f_main):
								try:
									self.cur.delete(f_sub)
								except:
									for f_sub_sub in self.cur.nlst(f_sub):
										try:
											self.cur.delete(f_sub_sub)
										except:
											self.cur.rmd(f_sub_sub)
		except ftplib.all_errors as e:
			print(f'Error:\n{e}')
		finally:
			self.cur.quit()
Ich weis ich verwende Tabs sollte man nicht aber hab nun so angefangen....

und ich würde sagen das ich hier nicht an dem Encoding änder....
Der code an Sicht geht ja mit den Ordnern und Dateien nur leider nicht mit den Umlauten...

Re: FTP Ordner auf SynoDS Erstellen mit Umlaute

Verfasst: Donnerstag 11. März 2021, 17:58
von Kalysto
ThomasL hat geschrieben: Donnerstag 11. März 2021, 07:07 oder halt Umlaute nicht verwenden oder auf vorhandene prüfen und äöü durch ae oe ue etc ersetzen. Nur so als Idee. Wer braucht deutsche Umlaute?
Ich hätte sie aber gerne :D

Re: FTP Ordner auf SynoDS Erstellen mit Umlaute

Verfasst: Donnerstag 11. März 2021, 20:23
von Sirius3
Warum nennst Du die FTP-Client-Instanz cur? Benutze aussagekräftige Namen!
Eingerückt wird immer mit 4 Leerzeichen pro Ebene, keine Tabs.
Variablennamen werden wie Attribute und Methoden komplett klein geschrieben.
Methoden sollten nach Tätigkeiten benannt werden. Bei Synology_DS718 weiß man nicht, was die Funktion tut.
Was sollen die Postfixe __CONFIG bedeuten, und warum steht da ein String "True" drin und nicht ein Wahrheitswert?
Benutze keine nackten except, weil die wirklich alle Fehler abfangen und so Programmierfehler nicht finden kann. Diese tiefe Verschachtelung ist nicht nur schwer zu lesen, sondern macht wahrscheinlich auch nicht das, was gewollt ist.

Nach einem except-Block muß dass Programm in einem Zustand sein, mit dem es weiter arbeiten kann. Bei einem Fehler in Synology_DS718 ist aber entweder ftp gar nicht definiert, oder aber die Verbindung nicht erfolgt, so dass es garantiert Folgefehler gibt, deren Ursprung man nicht finden kann.
ip, port, user und pwd sollte nicht irgendwo mitten in einer Methode tief verschachtelt stehen, sondern am besten als Konstanten ganz am Anfang der Datei.
customer wird gar nicht verwendet.

Und wie vermutet, mußt Du an der richtigen Stelle das Encoding setzen.

Code: Alles auswählen

FTP_IP = 'xxx.xxx.xxx.xxx'
FTP_PORT = xxxx
FTP_USER = 'xxxx'
FTP_PASSWORD = 'xxxxx'

# Hier erstelle ich mir meine FTP Verbindung
    def connect(self):
        try:            
            ftp = FTP_TLS(encoding='latin-1')
            ftp.ssl_version = ssl.PROTOCOL_TLSv1_2
            ftp.connect(FTP_IP, FTP_PORT)
            ftp.login(FTP_USER, FTP_PASSWORD)
            self.ftp_connection = ftp
        except ftplib.all_errors as e:
            print(f'Error connecting to FTP-Server:\n{e}')
            self.ftp_connection = None
        
    def createCustomerDirs__FTP(self):
        self.connect()
        if self.ftp_connection is None:
            # connection failed
            return
        ...