Verzeichnisse und Dateien

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
skypa
User
Beiträge: 97
Registriert: Freitag 5. Januar 2007, 03:13

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.

:oops:
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

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?
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.
skypa
User
Beiträge: 97
Registriert: Freitag 5. Januar 2007, 03:13

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 ~.~
Zuletzt geändert von skypa am Mittwoch 2. Januar 2008, 14:01, insgesamt 1-mal geändert.
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

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.
skypa
User
Beiträge: 97
Registriert: Freitag 5. Januar 2007, 03:13

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.



:roll:
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
skypa
User
Beiträge: 97
Registriert: Freitag 5. Januar 2007, 03:13

@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.
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`.
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

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