» »

[Python] Pomoč pri delu z datotekami

[Python] Pomoč pri delu z datotekami

strelajasna ::

Pozdravljeni.

Za fax imam za narediti projekt v pythonu. Izbral sem si preprost programček za delo z datotekami. Programečk mora znati preimenovati vse datoteke v mapi v isto ime in na koncu z zaporedno številko, narediti zip arhiv mape (tudi podmap), poiskati največjo datoteko v mapi (in podmapah) in najti največjo datoteko na disku.

Usplo mi je narediti večino, vendar se mi je pri metodah utavilo. Javlja mi napake, ki jih ne znam rešit.

Koda:
# -*- coding: utf-8 -*-

import pygtk
pygtk.require('2.0')
import gtk
import os
import Image
import zipfile
import sys

class urejanjeDat:
  
  def delete_event(self, widget, event, data=None):
    gtk.main_quit()
    return False
    
  def prebrskaj (self, widget, entry):
    dialog = gtk.FileChooserDialog("Izberi mapo:", None, gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
    dialog.set_default_response(gtk.RESPONSE_OK)
    
    izbor = dialog.run()
    if izbor == gtk.RESPONSE_OK:
      entry.set_text(dialog.get_filename())
    elif izbor == gtk.RESPONSE_CANCEL:
      print "Prekinitev"
    dialog.destroy()
  
  
  def rename (self, widget, entry1, entry2):
    ind = entry1.get_text()
    novoIme = entry2.get_text()
    num = 0
            
    for datoteka in os.listdir(ind):
      koncnica2 = datoteka.split(".")[len(datoteka.split("."))-1]
      num += 1
      novoime = novoIme + str(num) + "." + koncnica2
      #os.rename(datoteka, novoime) # preimenuje
      print novoime
      
	
  def zip_folder(self, widget, entry1, entry3):
    parent_folder = entry1.get_text()
    contents = os.walk(entry1)
    output_path = entry3.get_text()
        
    try:
      zip_file = zipfile.ZipFile(output_path, 'w', zipfile.ZIP_DEFLATED)
      for root, folders, files in contents:
	for folder_name in folders:
	  absolute_path = os.path.join(root, folder_name)
	  relative_path = absolute_path.replace(parent_folder + '\\','')
	  print "Adding '%s' to archive." % absolute_path
          zip_file.write(absolute_path, relative_path)
          for file_name in files:
	    absolute_path = os.path.join(root, file_name)
	    relative_path = absolute_path.replace(parent_folder + '\\','')
	    print "Adding '%s' to archive." % absolute_path
	    zip_file.write(absolute_path, relative_path)
	    print "'%s' created successfully." % entry3
    
    except IOError, message:
      print message
      sys.exit(1)
    except OSError, message:
      print message
      sys.exit(1)
    except zipfile.BadZipfile, message:
      print message
      sys.exit(1)
    finally:
      zip_file.close()
	
	
  def search(self, widget, entry1):
    dir = entry1.get_text()
    global biggest
    biggest = ("", -1)
    
    for item in os.listdir(dir):
      item = dir + "/" + item
    
      if os.path.isdir(item):
        search(item)
    
      else:
        itemsize = os.path.getsize(item)
        if itemsize > biggest[1]:
	  biggest = (item, itemsize)
	  
    print biggest
    
     
 
  def __init__(self):
    self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
    self.window.set_title("Urejanje datotek")
    self.window.connect("delete_event", self.delete_event)
    
    table = gtk.Table(8, 3, False)
    self.window.add(table) # dodamo oknu
    table.show()
    
    #brskanje
    napis1 = gtk.Label("Izberi mapo: ")
    table.attach(napis1, 0, 1, 0, 1)
    napis1.show()
        
    entry1 = gtk.Entry(max=0) # vnosno polje neomejene dol?ine
    entry1.set_text(os.getcwd())
    table.attach(entry1, 1, 2, 0, 1)
    entry1.show()
    
    gumb1 = gtk.Button("Prebrskaj")
    gumb1.connect("clicked", self.prebrskaj, entry1)
    table.attach(gumb1, 2, 3, 0, 1)
    gumb1.show()
    
    #preimenovanje
    naslov2 = gtk.Label("PREIMENOVANJE")
    table.attach(naslov2, 0, 1, 1, 2)
    naslov2.show()
    
    napis2 = gtk.Label("Novo ime: ")
    table.attach(napis2, 0, 1, 2, 3)
    napis2.show()
        
    entry2 = gtk.Entry(max=0) # vnosno polje neomejene dol?ine
    table.attach(entry2, 1, 2, 2, 3)
    entry2.show()
    
    gumb2 = gtk.Button("Preimenuj")
    gumb2.connect("clicked", self.rename, entry1, entry2)
    table.attach(gumb2, 2, 3, 2, 3)
    gumb2.show()
    
    #arhiviranje
    naslov3 = gtk.Label("ARHIVIRANJE")
    table.attach(naslov3, 0, 1, 3, 4)
    naslov3.show()
    
    napis3 = gtk.Label("Izberi ime arhiva: ")
    table.attach(napis3, 0, 1, 4, 5)
    napis3.show()
        
    entry3 = gtk.Entry(max=0) # vnosno polje neomejene dol?ine
    table.attach(entry3, 1, 2, 4, 5)
    entry3.show()
    
    gumb3 = gtk.Button("Arhiviraj")
    gumb3.connect("clicked", self.zip_folder, entry1, entry3)
    table.attach(gumb3, 2, 3, 4, 5)
    gumb3.show()
    
    #najve?ja datoteka v imeniku
    gumb4 = gtk.Button("Najdi najve?jo datoteko v imeniku")
    gumb4.connect("clicked", self.search, entry1)
    table.attach(gumb4, 1, 2, 5, 6)
    gumb4.show()
    
    #najve?ji imenik na disku
    gumb5 = gtk.Button("Najdi najve?ji imenik na disku")
    gumb5.connect("clicked", self.search, entry1)
    table.attach(gumb5, 1, 2, 6, 7)
    gumb5.show()
    
    #quit
    gumb6 = gtk.Button("Quit")
    gumb6.connect("clicked", lambda w: gtk.main_quit())
    table.attach(gumb6, 1, 2, 7, 8) 
    gumb6.show()
    
    self.window.show()
    
  def main(self):
    gtk.main()
    
def main ():
  gtk.main()
  return 0
  
if __name__ == "__main__":
  urejanjeDat()
  main()



In kje so problemi?
1. pri preimenovanju vseh datotek, ne morem preimenovati z uporabo os.rename. Če samo izpišem stara in nova imena, mi jih izpiše prav, ko ivedem os.rename, mi javi napako: "Traceback (most recent call last): OSError: [Errno 2] No such file or directory!"

2. arhiviranje mi tudi javlja napako:
"Traceback (most recent call last): File "projekt.py", line 53, in zip_folder for root, folders, files in contents:
File "/usr/lib/python2.7/os.py", line 276, in walk
names = listdir (top)
TypeError: coercing to Unicode: need string or buffer, gtk.Entry found

3. Iskanje največje datoteke mi dela samo v trenutni mapi, ne tudi v podmapah

4. do iskanja največje datoteke na disku nisem še uspeu prti, ker ne znam že pri prejšnji točki narediti iskanja v podmape



S tem se matram že nekaj časa, pregledal sem veliko tutorialov, poskusu različne možnosti, ampak ne morem anrediti da bi delalo. Prosim vas za pomoč, če se komu da pogledati in mi pomagati.


Hvala in LP


-- Naslednjič prosim uporabi st.koda tage da bo kaj berljivo :) -- moderator
  • spremenil: Mavrik ()

FrEaKmAn ::

1.
http://stackoverflow.com/questions/2759...

2.
am, ali je koda v projekt.py ista kot ta, ki si jo postal. Ne morem ugotoviti kje točno vrže ven, ker glede na napako je nekaj narobe v vrstici 53.. samo tam je čisto nekaj drugega

3.
osebno bi search malo drugače naredil, namesto da imaš global biggest, bi kot parameterer metodi podajal velikost največje in njeno pot (default 0 in None). Potem pa kot si začel, gledaš rekurzivno in če je večja, jo vrneš, če manjša pa tisto v parametrih.. upam da je jasno...

4.
prvo 3 reši

5. čisto informativno, kateri faks?

Zgodovina sprememb…

  • spremenil: FrEaKmAn ()

strelajasna ::

2. Javlja tocno to napako,vendar se je zgleda zgubilo nekaj enterjev. Prava vrstica napake je 51.

5. FAMNIT v Kopru


hvala za pomoc

FrEaKmAn ::

si 100%..

imam bolj občutek da je problem v vrstici 44 v tej kodi ki si jo dodal. tvoj parameter entry1 je tipa gtk.Entry medtem ko os.walk (http://docs.python.org/library/os.html#... sprejema samo stringe....


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Razvoj v Qt ali GTK

Oddelek: Pomoč in nasveti
141138 (884) krneki0001
»

Ruby + Glade ... težave

Oddelek: Programiranje
91605 (1398) sebatronic
»

Microsoftova Encarta ukinjena

Oddelek: Novice / Ostale najave
83874 (3488) 3p
»

[razvoj] klon windows commanderja za linux (strani: 1 2 3 )

Oddelek: Programiranje
1006623 (4662) napsy
»

Particije!

Oddelek: Pomoč in nasveti
5845 (747) [t502]

Več podobnih tem