Seite 1 von 1

Jupyter Notebook

Verfasst: Freitag 6. September 2019, 14:29
von Fabian2712
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'

Re: Jupyter Notebook

Verfasst: Freitag 6. September 2019, 14:47
von sparrow
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?

Re: Jupyter Notebook

Verfasst: Freitag 6. September 2019, 15:31
von /me
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

Re: Jupyter Notebook

Verfasst: Freitag 6. September 2019, 18:47
von Fabian2712
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 =))

Re: Jupyter Notebook

Verfasst: Freitag 6. September 2019, 19:03
von Sirius3
Wenn es Dich stört, benutze doch das modernere `pathlib`.

Re: Jupyter Notebook

Verfasst: Freitag 6. September 2019, 19:06
von ThomasL
Obige Beiträge nochmal lesen und verstehen und dann so coden:

Code: Alles auswählen

basedir = 'C:\\Users\\Fabian\\Documents\\bee_bumble'

Re: Jupyter Notebook

Verfasst: Samstag 7. September 2019, 18:18
von Fabian2712
Danke hat geklappt =)