2016-04-19 19 views
0

Hallo Jeder, den ich auf meinem letzten Projekt arbeite, und ich bin ein Verzeichnis SchnüfflerPython Directory-Reader Tkinter GUI funktioniert nicht richtig

So, hier ist die Grundlinie dieses Skript erstellen:

  1. GUI mit Tkinter, dass fragt den Benutzer nach dem Verzeichnis und fordert den Benutzer dazu auf, eine cvs-Datei in dem Bereich ihrer Wahl zu speichern. CSV enthält Dateiname, Dateierweiterung und Dateigröße aus dem Verzeichnis der Benutzer eingegeben.
  2. Meine GUI hat ein Textbildlauffeld, das den Prozess des Skript und Drucks gedruckt werden soll, wenn es fertig ist,

Meine Probleme:

  • Als CSV speichern. Es produziert nicht eine CSV und ich bekomme diesen Fehler
    „Valueerror: I/O-Operation auf geschlossene Datei“ .asksaveasfilename() ist funktioniert nicht

  • GUI Text Bildlauffeld nicht funktioniert und die Informationen auszudrucken ich brauche

    • Wie kann ich Header meine CSV hinzufügen, so dass mein CSV
      Dateinamen hat, Erweiterung, Größe und Kommentar

Anbei unten ist mein Skript. Kann mir jemand dabei helfen?

from Tkinter import Tk 
from tkFileDialog import askdirectory 
from array import * 
import os 

version = '1.0' 

import os 
import csv 
from Tkinter import BOTH, LEFT, TOP, END, StringVar 
from ttk import Frame, Entry, Button, Label 
from ScrolledText import ScrolledText 
from tkFileDialog import askdirectory 
from tkFileDialog import asksaveasfilename 


class FileWalkerWindow(Frame): 
    def __init__(self): 
     Frame.__init__(self) 
     self.pack(expand=True, fill=BOTH) 
     self.master.title("Directory Snooper v" + version) 
     self.master.iconname("Directory Snooper") 

     self.dir = StringVar() # tkinter does not work with standard python variables 
     self.dir.set(os.getcwd()) # set to current working directory 

     description = "This program walks through a directories " \ 
         + "print out name of directory file path. " \ 
         + "prints out mumber of files in your in your directory. " \ 
         + "It list files and tests for corrupted zipfiles and " \ 
         + "creates a CSV file of the findings" 

     row1 = Frame(self) 
     Label(row1, text="Choose Directory:").pack(side=LEFT, pady=10) 
     self.dir_ent = Entry(row1, width=80, textvariable=self.dir) 
     self.dir_ent.pack(side=LEFT) 
     Button(row1, text="Browse", width=10, command=self.browse).pack(side=LEFT, padx=5) 
     row1.pack(side=TOP, ipadx=15) 

     row2 = Frame(self) 
     btn = Button(row2, text="Snoop", command=self.savefile, width=15) 
     btn.pack(side=LEFT, padx=5, pady=10) 
     row2.pack(side=TOP) 

     self.output = ScrolledText(self, height=15, state="normal", 
            padx=10, pady=10, 
            wrap='word') 
     self.output.insert(END, description) 
     self.output.pack(side=LEFT, fill=BOTH, expand=True, padx=5, pady=5) 

     self.bind('<Key-Return>', self.savefile) # bind enter press to walk 

    def browse(self): 
     dirpath = askdirectory(parent=self, title="Select Directory") 
     self.dir.set(dirpath) 

    def savefile (self): 
     self.output.delete(1.0, END) 
     name=asksaveasfilename() 
     with open(name,'w') as csvfile: 
      dirList = os.listdir(self.dir.get()) 
      data = ((fname, str(os.path.getsize(self.dir.get() + "/" + fname)), str(os.path.splitext(fname)[1]),) for 
        fname in 
        dirList) 
      for entry in data: 
       create=csv.writer(csvfile) 
       create.writerow(','.join(entry) + '\n') 
       csvfile.close() 


if __name__ == '__main__': 
    FileWalkerWindow().mainloop() 

Antwort

0

When saving CSV. It does not produce a CSV and I get this error "ValueError: I/O operation on closed file"

Sie tun, um die Datei in Ihrem for-Schleife schließen:

for entry in data: 
    create=csv.writer(csvfile) 
    create.writerow(','.join(entry) + '\n') 
    csvfile.close() 

Unindent es die Datei nach der for-Schleife zu schließen. Sie sollten auch die csv.writer() außerhalb der for Schleife bewegen (wie in den Kommentaren erwähnt):

create=csv.writer(csvfile) 
for entry in data: 
    create.writerow(','.join(entry) + '\n') 
csvfile.close() 

GUI text scroll box is not working and printing out the information i need

Die Frage ist, wenn Sie die Informationen angezeigt werden sollen!
Sie können eine Schaltfläche hinzufügen, um den Inhalt des ausgewählten Verzeichnisses zu drucken oder es automatisch zu drucken, wenn der Benutzer einen Ordner zum Durchsuchen auswählt.

diese zu tun, können Sie Sie browse Methode, bearbeiten, die aussehen sollte:

How do I add headers to my CSV so that my CSV will have filename,extension,size, and comment

einfach eine Python Zeichenfolge enthält Ihre Header schreiben, bevor Istwerten Schreiben

def browse(self): 
    dirpath = askdirectory(parent=self, title="Select Directory") 
    self.dir.set(dirpath) 
    self.output.insert(END, "\n" + "\n".join(os.listdir(dirpath))) 
:

with open(name,'w') as csvfile: 
    csvfile.write("filename,extension,size,comment") 
    dirList = os.listdir(self.dir.get()) 
    # some other stuff after... 

Bitte beachten Sie auch, dass, obwohl es stark von Python Richtlinien zu entmutigen ist Verwenden Sie from module import * im Allgemeinen, die Standardmethode zum Importieren Tkinter ist from Tkinter import * :)

+0

ist dieser Vorschlag über 'close' korrekt? Bei jeder Iteration wird ein neuer 'csv.writer' erstellt. Es scheint so, als müsste das auch außerhalb der Schleife verschoben werden. dh: entweder öffnen und schließen Sie es jedes Mal, oder öffnen Sie es vor der Schleife und schließen Sie es danach. –

+0

Sie haben Recht, die Erstellung von 'cvs.writer()' bei jeder Iteration ist eine schlechte Sache, ich werde meine Antwort aktualisieren, um das auch zu lösen. Allerdings adressierte ich nur das ursprüngliche Problem, das von 'csvfile.close() 'kam, das innerhalb der Schleife ist :) – filaton

Verwandte Themen