Noobfrage: Streamlit , Datei kopieren

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
maow
User
Beiträge: 29
Registriert: Mittwoch 24. Februar 2016, 16:30

Hallo ich bin neu beim Programmieren und brauche für ein Projekt aktuell folgende Funktion (unter der Verwendung von Streamlit):

(dies ist kein Code, aber eine Beschreibung dessen, was zu tun ist:)
'wähle Datei aus, welche kopiert werden soll /alternativ: den Ordner | kopiere die datei | erstelle einen unterordner in dem Verzeichnis | füge die Datei dort ein | stelle sicher, dass letzteres funktioniert, also ausreichend zugriffsrechte vorhanden sind)



Ansätze:
1)bei streamlit kann man mit st.file_uploader einen Uploader integrieren, wo man eine Datei auswählt, mit der man später arbeiten möchte. Ich weiß jedoch nicht, wie ich die Auswahl des nutzers daraus extrahiere, sodass ich später da irgendwie darauf zugreifen kann und das verwenden kann, um in dem Verzeichnis, wo die Datei ausgewählt wird mit der irgendwas gemacht wird, eben ein unterordner erzeugt wird, wo dann eine excel abgelegt wird
2) mit shutil könnte ich wohl anscheinend auch arbeiten, jedoch lese ich überall, dass man dann probleme mit den zugriffsrechten auf den ordner bekommt -.-
3) Tja, da ich leider Anfänger bin, bin ich absolut überfragt wie ich das lösen kann. Ich hoffe hier hat jemand eine Idee :)

Danke soweit, bleibt lieb,

lg maow
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Ich kenne streamlit nicht, aber das braucht man auch nicht um eine Datei zu kopieren. Dafür solltest du dir die Module 'pathlib' und 'shutil' ansehen.

Der Rest klingt, als würdest du das irgendwie in ein bestehendes Programm integrieren wollen. Der nächste Schritt wäre dann also zu schauen, wie und wo das dort integriert werden kann. Entweder direkt im Code oder durch etwas, was das Programm anbietet. Dafür gibt es kein pauschales Rezept.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@sparrow: soweit ich verstanden habe, ist streamlit eine Webframework, das es erlaubt, Dateien hochzuladen. Von daher ist es hier relevant, wie und wo damit Dateien hochgeladen werden.

@maow: Du hast keinen direkten Zugriff auf ein Verzeichnis des Users, weil alles über einen Browser läuft. Wenn der Nutzer auf Ergebnisse zugreifen können soll, mußt Du das irgendwie als Download anbieten.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Hallo maow,

ich habe mit streamlit noch nichts gemacht. Sieht aber interessant aus.

Wenn ich dich richtig verstehe, möchtest du Benutzereingaben in deinem Widget behandeln?
Falls das der Fall ist, könnte dir das weiterhelfen:
https://docs.streamlit.io/en/stable/api ... ve-widgets

In der Gallery findest du vielleicht etwas:
https://streamlit.io/gallery

Einige von den Beispielen haben auch den Source Code verlinkt.
maow
User
Beiträge: 29
Registriert: Mittwoch 24. Februar 2016, 16:30

Hey und danke soweit für eure ANtworten. Da ich beruflich gerade stark eingespannt bin, habe ich noch keine Zeit gefunden die Links durchzuklicken/zu lesen.

Hier aber nochmal ein einfaches (unvollst.) Beispiel was passieren soll:

Code: Alles auswählen

import streamlit as st

 single_file = st.file_uploader("Uploader")

    with st.beta_expander("Eingelesene Parameter werden analysiert, berechnet etc."): 
        if single_file:
        #gefolgt von viel code
    
    with st.beta_expander("Berechnungen werden in Excel geschrieben"): 
        if single_file:
        #1)kopiere excel datei
        #2)erzeuge ordner, bestenfalls als unterordner in dem Ziel des st.file_uploaders
        #3)lege die Kopie dort ab und
        #4)pack da dann die werte rein
    
Wie gesagt 1 bis 3 ist das was ich nich hin bekomme, 4 sollte gehen mit df.iat /~.at

Mein Gefühl sagt mir halt, dass alleine der Umstand, dass ich da irgendwie rausfiltern soll, wo der Benutzer da nun im File Uploader hin navigiert hat , es nicht so trivial ist :( Ich schau mir sobald ich dazu komme jedenfalls mal eure Tipps genauer an :) Danke soweit


P.S. Übrigens kann man streamlit anscheinend auch als ausführbare Datei starten. Da bin ich bisher leider noch nicht ganz durchgestiegen wie das geht. Aber es ist nicht direkt eine Webgeschichte. Also gut.. hmm.. Naja man nutzt schon den Browser, aber soweit ich weiß lade ich da nix hoch irgendwo oder es muss was gedownloaded werden. Allerdings werden Applikationen anscheinend primär veröffentlicht.
maow
User
Beiträge: 29
Registriert: Mittwoch 24. Februar 2016, 16:30

Nachtrag / Edit ?:
Also hab mir mal die API nochmal angeschaut und da soweit nix gefunden.

Als workaround kann ich mir aber vorstellen, einfach den Ordner auf den lokalen Desktop erstellen zu lassen (wo dann weiterhin die Nutzungsrechte ein Thema sind; hab mich aktuell noch nicht in die o.g. shutil etc. eingelesen; folgt). Dieser muss dann auch vorhanden sein, damit es eben funktioniert. Das wär bis ich da vielleicht als Zwischenlösung erstmal okay. Dann hätte ich aber das Problem, dass der Benutzername bei jedem Nutzer ein anderer sein wird. Gibt es also einen Ordner der auf jeden Windows 10 Rechner in seiner Adresse gleich ist (also nicht ~User/'Nutzername', sondern dafür sowas wie 'User' ?


Übrigens zu Streamlit nochmal:

Ich mach das aktuell erstmal um einfache Programmierung umzusetzen, mit bereits Erfolgen, die man glauibe als Anfänger nicht so eben hin bekäme (GUI...) und habe vor, das Programm später zu einer .exe zu exportieren. Das ist bei Streamlit möglich, d.h. man veröffentlicht erst, dann exportiert man das. Ich erhalte somit eine Desktop-App-Version, muss mich um die Tiefe der GUI Programmierung zunächst nicht kümmern und hab erste Erfolge :)
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Es ist egal, ob Du lokal einen Webserver startest, oder ob der irgendwo auf der Welt steht. Der Browser verrät dem Server nicht, woher eine Datei kommt. Es gibt zwar inzwischen eine File-API, aber das braucht erweiterte Rechte und wird von Streamlit sehr wahrscheinlich nicht unterstützt.
Dein Workaround mag funktionieren, wenn Du wirklich nur einen lokalen Server laufen hast.
Antworten