Jupyter Notebook

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.
Antworten
Fabian2712
User
Beiträge: 6
Registriert: Freitag 6. September 2019, 14:03

Guten Tag,

ich schreibe gerade meine Bachelorarbeit dabei nutze ich als Anfänger in Bezug auf neuronale Netze und Informatik allgemein ein Buch um ein Convolutional Neural Network mit Juypter Notebook zu erstellen. Dabei soll eine csv Datei von einer Website gedownloadet werden (in einen von mir erstellte Ordnerstruktur unter Windows 10). Sobald jedoch die Ordnerstruktur von mir zuende ist und die Dateien eingefügt werden sollen bekomme ich einen fehler (denke das liegt an den doppelten backslashes die vorhanden sind sobald durch den befehl der Dateipfad erweitert wird und die nicht weggehen). Den gesamten Code habe ich aus dem buch 1 zu 1 übernommen und mehrfach auf Fehler überprüft:

import pandas as pd
from urllib.request import urlretrieve
import PIL
import os
import shutil
import numpy as np

basedir = r'/C:/Users/Fabian/Documents/bee_bumble'

dir_dict = {
'download': os.path.join(basedir,'Download'),
'train': os.path.join(basedir,'train'),
'test': os.path.join(basedir,'test'),
'valid': os.path.join(basedir,'valid'),
'train_bee': os.path.join(basedir,'train','biene'),
'train_bumble': os.path.join(basedir,'train','hummel'),
'test_bee': os.path.join(basedir,'test','biene'),
'test_bumble': os.path.join(basedir,'test','hummel'),
'valid_bee': os.path.join(basedir,'valid','biene'),
'valid_bumble': os.path.join(basedir,'valid','hummel')
}

Bis hier geht alles =)

url = 'https://raw.githubusercontent.com/dionh ... labels.csv'
urlretrieve (url, os.path.join(dir_dict['download'],'train_labels.csv'))

hier kommt der Fehler: OSError: [Errno 22] Invalid argument: '/C:/Users/Fabian/Documents/bee_bumble\\Download\\train_labels.csv'
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Ich würde sagen, das Problem ist eher der _führende_ Slash bei dem Pfad. Seit wann kommt denn bei Windows etwas vor dem Laufwerksbuchstaben?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Fabian2712 hat geschrieben: Freitag 6. September 2019, 14:29 denke das liegt an den doppelten backslashes die vorhanden sind sobald durch den befehl der Dateipfad erweitert wird und die nicht weggehen
Sicherheitshalber ein kleiner Exkurs zu Backslashes und String-Repräsentation.

Der Backslash ist ein Escape-Zeichen. Man verwendet ihn zum Beispiel dafür um im Code in einem String mit "\n" einen Zeilenumruch zu erzeugen oder mit "\t" einen Tabulator. Der resultierende String enthält dann natürlich im Falle des Zeilenumbruchs nicht die beiden Zeichen "\" und "n" sondern halt einen Zeilenumbruch. Da der Backslash als Escape-Zeichen verwendet wird ist die Frage, wie man den den Backslash selber im Code in einen String bekommt. Eigentlich logisch: man escaped ihn. Schreibst du also "\\" siehst du im Code zwei Backslashes aber im String wird daraus nur ein einziges Backslash-Zeichen.

Du kannst das sehen, wenn du den String ausgibst. Häufig wird aber die Repräsentation des Strings ausgegeben, also das was man in Python eingeben müsste um den String wieder zu erhalten. Schau dir das folgende Beispiel an:

Code: Alles auswählen

>>> foo = "\\"
>>> print(foo)
\
>>> print(repr(foo))
'\\'
>>> 
Oder dies hier:

Code: Alles auswählen

>>> 'Monty\nPython'
'Monty\nPython'
>>> print('Monty\nPython')
Monty
Python
Du kannst auch Raw-Strings verwenden in den jedes Zeichen das bedeutet, was im Code steht. Raw-Strings sehen im Code aus wie normale Strings, haben aber ein führendes r.

Code: Alles auswählen

>>> print(r'\\')
\\
Und jetzt die Preisfrage: Wie sieht die Repräsentation von r"\\" aus? So:

Code: Alles auswählen

>>> r'\\'
'\\\\'
Python weiß nicht, dass der Wert als Raw-String eingegeben wurde. Das ist auch nicht wichtig. Python weiß aber, dass der String zwei Backslashes enthält egal wie die dort hingekommen sind. Für die repr-Darstellung muss jeder Backslash escaped werden und so werden aus den 2 plötzlich 4. Wichtig: es ist im Ergebnis absolut das gleiche.

Code: Alles auswählen

>>> r'\\' == '\\\\'
True
Fabian2712
User
Beiträge: 6
Registriert: Freitag 6. September 2019, 14:03

Also bis zum Dateipfad den ich selber erstellt habe werden ja keine doppelten backslashes gemacht nur ab da wo neue Sachen erstellt werden also ab download. Wie könnte ich denn im code ändern dass das nicht passiert? Am besten einfach den korrigierten Code senden (wie gesagt bin noch neu =))
Sirius3
User
Beiträge: 17753
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn es Dich stört, benutze doch das modernere `pathlib`.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Obige Beiträge nochmal lesen und verstehen und dann so coden:

Code: Alles auswählen

basedir = 'C:\\Users\\Fabian\\Documents\\bee_bumble'
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
Fabian2712
User
Beiträge: 6
Registriert: Freitag 6. September 2019, 14:03

Danke hat geklappt =)
Antworten