Seite 1 von 1
Verzeichnisse und Dateien
Verfasst: Mittwoch 2. Januar 2008, 13:28
von skypa
Ich hab ein merkwürdiges Problem mit Python.
Dieses Skript, geschrieben in Perl, macht genau das was ich will,
ich checks nur irgendwie nich dasselbe in Python zu tun.
HILFE!!!
Code: Alles auswählen
#!/usr/bin/perl
if(@ARGV!=1){print "Usage: $0 <file>\n";exit;}($file)=@ARGV;
$intro = "-------------------------------Listing-------------------------------";
print $intro;
$counter=();
open(FILE,">$file");
print FILE $intro;
$dir="..";
opendir(DIR, $dir) or die "Access denied: $dir: $!";
while(defined($files = readdir(DIR)))
{
print $files."\t";
$counter++;
print FILE $files."\n";
}
print $counter."\n";
print FILE $counter;
close(FILE);
closedir(DIR);
Bevor einer jetzt schreibt: "Wer kann denn schon Perl lesen?!"
Die 2te Zeile bedeutet, das als Argument ein Dateiname angegeben wird wo die Daten dan gespeichert werden.
Der Rest ist wohl selbsterklärend nehm ich mal an.
Bei beiden Skript fehlt noch eine Split Funktion um nur den reinen Dateinamen in einer Liste parat zu haben.

Re: Verzeichnisse und Dateien
Verfasst: Mittwoch 2. Januar 2008, 13:34
von keppla
skypa hat geschrieben:Ich hab ein merkwürdiges Problem mit Python.
Dieses Skript, geschrieben in Perl, macht genau das was ich will,
ich checks nur irgendwie nich dasselbe in Python zu tun.
wie sieht denn dein Ansatz aus?
Verfasst: Mittwoch 2. Januar 2008, 13:40
von BlackJack
@skypa: Und wo liegt nun das Problem? Die Module `sys` und `os` sind Dir bekannt?
Der Name `$files` für einen *einzelnen* Verzeichnis-Eintrag hat mich beim ersten Lesen übrigens etwas verwirrt.
Verfasst: Mittwoch 2. Januar 2008, 13:44
von skypa
Code: Alles auswählen
import wx, os
def load(event):
if __name__ == "__main__":
app = wx.PySimpleApp()
dialog = wx.DirDialog(None, "Choose a directory:",
style=wx.DD_DEFAULT_STYLE | wx.DD_NEW_DIR_BUTTON)
if dialog.ShowModal() == wx.ID_OK:
print dialog.GetPath()
dialog.Destroy()
app = wx.App()
win = wx.Frame(None, title="Listbox", size=(205, 170))
bkg = wx.Panel(win)
loadButton = wx.Button(bkg, label='Open')
loadButton.Bind(wx.EVT_BUTTON, load)
filename = wx.TextCtrl(bkg)
contents = wx.TextCtrl(bkg, style=wx.TE_MULTILINE | wx.HSCROLL)
hbox = wx.BoxSizer()
hbox.Add(filename, proportion=1, flag=wx.EXPAND)
hbox.Add(loadButton, proportion=0, flag=wx.LEFT, border=5)
vbox = wx.BoxSizer(wx.VERTICAL)
vbox.Add(hbox, proportion=0, flag=wx.EXPAND | wx.ALL, border=5)
vbox.Add(contents, proportion=1,
flag=wx.EXPAND | wx.LEFT | wx.BOTTOM | wx.RIGHT, border=5)
bkg.SetSizer(vbox)
win.Show()
app.MainLoop()
So bislang. Hab Versuche unternommen mit os.walk was ich hier schon gelesen habe (im Augenblick nicht im Code enthalten). Aber irgendwie tuts das nich...
Hinzukommen soll noch eben die Split-Funktion wo man auch noch eigene Parameter eingeben kann.
Achja, und irgendwie is das Bockmist:
Code: Alles auswählen
def load(event):
if __name__ == "__main__":
app = wx.PySimpleApp()
dialog = wx.DirDialog(None, "Choose a directory:",
style=wx.DD_DEFAULT_STYLE | wx.DD_NEW_DIR_BUTTON)
if dialog.ShowModal() == wx.ID_OK:
print dialog.GetPath()
dialog.Destroy()
jemand ne bessere Idee?!
@BlackJack: Ja sind mir bekannt, aber irgendwie check ichs nicht ~.~
Verfasst: Mittwoch 2. Januar 2008, 13:51
von keppla
Ich bin jetzt etwas verwirrt, dein Pythonansatz ist etwas völlig anderes als das bisschen, was ich von perl verstehe (nein, ich sage nicht, dass man perl nicht lesen kann, sondern dass ICH perl nicht lesen kann/will).
Dein Perlcode mach nichts mit Wx.
Formuliere doch bitte mal so kurz wie möglich, was dein Skript können soll.
Verfasst: Mittwoch 2. Januar 2008, 13:58
von skypa
Oh ja, entschuldige bitte.
Also kurz und knapp:
Pfadangabe über Directory Dialog (im Perl Skript nicht implementiert da ich dort keien GUI schreiben wollte).
Einlesen aller enthaltenen Dateinamen; Splitten und in einer darunter liegenden "Box" ausgeben um den Dateinamen dann weiter verarbeiten zu können mittels copy+paste oder etwas anderem.
Das Prinzip kennt man von Tankstellen in den Kühlschränken sind da doch die Flaschen drinne, holst eine raus kommen die anderen nach.
So in etwa hab ich mir das auch vorgestellt.

Verfasst: Mittwoch 2. Januar 2008, 14:28
von keppla
erstmal ein paar kleinigkeiten:
der if __name__ == '__main__'-teil macht innerhalb einer funktion keinen sinn.
Die Abfrage verwendet man meist auf unterter ebene, um etwas nur dann auszuführen, wenn die datei direkt aufgerufen wird.
Innerhalb einer funktion ist das imho unsinnvoll, ich würde es einfach rausnehmen.
Weiterhin ist es empfehlenswert, sich an den Python-styleguide zu halten, der z.B. besagt: 4-spaces-indent,
nun zum eigentlichen: bei welchem der von dir genannten Schritten hakts denn?
So wie ich dein skript lese, bekommst du vmtl schon das Form und den verzeichnisnamen.
Den könntest du dann mit os.path behandeln.
Verfasst: Mittwoch 2. Januar 2008, 14:29
von Leonidas
Wie wäre es wenn du *erst* das Programm schreibst, dann die GUI dazu? So wie du es machst, ist als würde man das Dach von einem Hause zuerst bauen und dann überlegen wie man die Wände dann noch reinbekommt.
Verfasst: Mittwoch 2. Januar 2008, 17:00
von skypa
@Leonidas: Ja man kann das schnell denken, nur wollt ich einfach schon etwas näher dem Ziel kommen, trotz fehlender Verzeichnis-Operationen.
Aber warum is das in Perl so einfach und in Python anscheinend so umständlich?!... os.path hab ich mir jetzt angesehen, aber das was ich sehe ist bringt mich net weiter irgendwie.
Verfasst: Mittwoch 2. Januar 2008, 17:07
von BlackJack
Das ist in Python nicht umständlich. Im Gegenteil finde ich die vorgestellte Perl-Methode für die Verzeichniseinträge umständlicher als Python.
Ansonsten kann man den Perl-Code recht direkt nach Python übersetzen. Wo genau ist denn das Problem? `os.path` braucht man übrigens nicht, nur eine Funktion aus `os`.
Verfasst: Mittwoch 2. Januar 2008, 17:13
von keppla
skypa hat geschrieben:Aber warum is das in Perl so einfach und in Python anscheinend so umständlich?!... os.path hab ich mir jetzt angesehen, aber das was ich sehe ist bringt mich net weiter irgendwie.
da ich perl nicht kann, vermute ich mal folgendes:
der code nimmt einen verzeichnisnamen, und gibt alle dateien, die in dem verzeichnis liegen, in eine Datei aus, und schreibt zusätzlich die Anzahl der Dateien noch in die Datei.
Wo ist also das Problem?
iterationen macht man mit for x in y:, dateien offnet man mit open, man schreibt mit f.write rein, dateien eines Verzeichnises bekommt man mit os.path.listdir, wie schon gesagt wurde.
Ehrlich gesagt sieht die Lösung in python, die sich in meinem Kopf bildet, einfacher aus, als die in perl.