FTP Ordner auf SynoDS Erstellen mit Umlaute

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.
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

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
Benutzeravatar
__blackjack__
User
Beiträge: 14055
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

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

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.
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

Verstehen muss ich’s dennoch nicht :roll:

Es geht und das passt :D
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

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 ^^
Benutzeravatar
__blackjack__
User
Beiträge: 14055
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

@__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
Benutzeravatar
__blackjack__
User
Beiträge: 14055
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kalysto: Die Ausgabe ist nicht vollständig, und das was fehlt ist wichtig.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

@__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 ?
Benutzeravatar
__blackjack__
User
Beiträge: 14055
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

@__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.
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

Keiner eine idee ? ;(
Benutzeravatar
__blackjack__
User
Beiträge: 14055
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

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 ^^
Benutzeravatar
ThomasL
User
Beiträge: 1379
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

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 bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

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...
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

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

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
        ...
Antworten