Moderators Spect~ Δημοσ. 24 Ιουνίου 2016 Moderators Δημοσ. 24 Ιουνίου 2016 (επεξεργασμένο) Ηθελα να κανω αλλη μια χαμαλοδουλεια και η πιο ευκολη επιλογη ηταν να φτιαξω ενα script να το κανει για μενα. Στο συγκεκριμενο επιλεγεις τον φακελο root στον οποιο θες να μετονομασει ολα τα ονοματα αρχειων που ειναι γραμμενα στα ελληνικα στα αγγλικα(greeklish). Μολις γινει η μετονομασια εμφανιζει οσα αρχεια μετονομαστικαν και δινει την επιλογη για μετονομασια πισω στο αρχικο ελληνικο ονομα (Αυτη η επιλογη δουλευει οσο δεν εχει κλεισει το προγραμμα). from tkinter.filedialog import askdirectory from tkinter import messagebox from tkinter import * import tkinter as tk import time import os Letter_Map = { 'Α': 'a', 'Ά': 'a', 'Β': 'b', 'Γ': 'g', 'Δ': 'd', 'Ε': 'e', 'Έ': 'e', 'Ζ': 'z', 'Η': 'i', 'Ή': 'i', 'Θ': 'th', 'Ι': 'i', 'Ί': 'i', 'Κ': 'k', 'Λ': 'l', 'Μ': 'm', 'Ν': 'n', 'Ξ': 'x', 'Ο': 'o', 'Ό': 'o', 'Π': 'p', 'Ρ': 'r', 'Σ': 's', 'ς': 's', 'Τ': 't', 'Υ': 'y', 'Ύ': 'y', 'Φ': 'f', 'Χ': 'x', 'Ψ': 'ps', 'Ω': 'w', 'Ώ': 'w' } class MainWindow(Frame): def __init__(self, root): Frame.__init__(self, root) self.root = root self.not_pressed = True self.changed = False self.root_directory = None self.original_names_list = None self.original_names = {} self.letter_map = Letter_Map.copy() self.path_entry() def init(self): start = time.time() self.root.title("Greek to Greeklish Rename") scrollbar = tk.Scrollbar(self.root, orient="vertical") self.original_names_list = tk.Listbox(self.root, width=50, height=20, yscrollcommand=scrollbar.set) scrollbar.config(command=self.original_names_list.yview) scrollbar.pack(side="right", fill="y") self.original_names_list.config(width=0) self.original_names_list.pack(fill="both", expand=True) Button(self.root, text="Rename to original name", command=self.rename_to_original).pack(fill=X) for subdir, dirs, files in os.walk(self.root_directory): if files: for current_file_name in files: current_folder_path = os.path.join(self.root_directory, subdir) original_file_path = os.path.abspath(os.path.join(current_folder_path, current_file_name)) if os.path.exists(original_file_path): name_changed_to_greeklish = self.name_change(current_file_name) if self.changed: renamed_file_path = current_folder_path + "\\" + name_changed_to_greeklish os.rename(original_file_path, renamed_file_path) self.original_names[name_changed_to_greeklish] = {'original_name': current_file_name} self.original_names_list.insert('end', current_file_name + ' --> ' + name_changed_to_greeklish) self.changed = False self.root.deiconify() end = time.time() messagebox.showinfo('Rename to Greeklish', 'Completed in : ' + str(end - start) + 'seconds.') def rename_to_original(self): if self.not_pressed: start = time.time() self.not_pressed = False self.original_names_list.delete(0, END) for subdir, dirs, files in os.walk(self.root_directory): if files: for current_file_name in files: current_folder_path = os.path.join(self.root_directory, subdir) original_file_path = os.path.abspath(os.path.join(current_folder_path, current_file_name)) if os.path.exists(original_file_path) and current_file_name in self.original_names: name_changed_to_greek = self.original_names.get(current_file_name).get('original_name') renamed_file_path = current_folder_path + "\\" + name_changed_to_greek os.rename(original_file_path, renamed_file_path) self.original_names_list.insert('end', current_file_name + ' --> ' + name_changed_to_greek) end = time.time() messagebox.showinfo('Rename to Greek', 'Completed in : ' + str(end - start) + 'seconds.') def name_change(self, old_name): name_english = '' ext_position = old_name.rfind('.') extension = old_name[ext_position:] for letter in old_name[:ext_position]: self.letter_change(letter) en_letter = self.letter_change(letter) name_english += en_letter name_english = name_english.title() + extension return name_english def letter_change(self, gr_letter): cap = False if gr_letter.istitle(): cap = True en_letter = self.letter_map.get(gr_letter.title()) if en_letter: self.changed = True else: en_letter = gr_letter if cap: en_letter = en_letter.title() return en_letter def path_entry(self): self.root.withdraw() self.root_directory = askdirectory() while not self.root_directory: pass self.init() rt = Tk() app = MainWindow(rt) rt.mainloop() Λινκ για το exe https://www.dropbox.com/s/5ze9rpqff6atq3f/GreekToGreeklishRename.zip?dl=0 ΥΓ: ανανεωσα ξανα τον κωδικα Επεξ/σία 24 Ιουνίου 2016 από Spect~
pmav99 Δημοσ. 24 Ιουνίου 2016 Δημοσ. 24 Ιουνίου 2016 To είπε χτες και ο Defacer: http://www.insomnia.gr/topic/613414-vba-%CE%BA%CE%AC%CE%BD%CE%BF%CE%BD%CF%84%CE%B1%CF%82-%CF%84%CE%BF%CE%BD-%CE%BA%CF%8E%CE%B4%CE%B9%CE%BA%CE%B1-%CE%BC%CE%B9%CE%BA%CF%81%CF%8C%CF%84%CE%B5%CF%81%CE%BF/ Αντί για επαναλαμβανόμενα elif χρησιμοποίησε ενα dict http://scottlobdell.me/2014/05/time-efficiency-statements-vs-python-dictionaries/
Moderators Spect~ Δημοσ. 24 Ιουνίου 2016 Μέλος Moderators Δημοσ. 24 Ιουνίου 2016 Ναι το ειχα διαβασει το ποστ αλλα βαριομουν να μπω στη διαδικασια να το κανω γιατι ηταν πιο απλο και γρηγορο να κανω την if elif! Αν δεν βαριεμαι αργοτερα ισως το αλλαξω! τελικα βαριομουν τοσο που το εκανα θα κανω αργοτερα update τον κωδικο και το εκτελεσιμο. Για την ιστορια ετρεξα τους 2 κωδικες με if elif + dict στον ιδιο φακελο εννοειται και τα αποτελεσματα φαινονται στην φωοτγραφια και ο φακελος στον οποιο ετρεξαν 24,530 Files, 2,363 Folders
pmav99 Δημοσ. 24 Ιουνίου 2016 Δημοσ. 24 Ιουνίου 2016 To elif που είχες γράψει ήταν ιδιαίτερα αργό γιατί σε κάθε branch έκανες gr_letter.upper() == 'c' Δηλαδή: 1. attribute lookup για να βρεις τη μέθοδο upper 2. function call όταν καλούσες την μέθοδο 3. comparison Αν το είχες γράψει έτσι: upper_gr_letter = gr_letter.upper() if upper_gr_letter == 'c': .... elif upper_gr_letter == 'd': ... οι διαφορές δεν θα ήταν τόσο μεγάλες γιατί θα είχες μόνο τα comparisons ΥΓ. H θέση του κώδικα είναι σε github/gitlab/bitbucket και όχι εδώ.
Moderators Spect~ Δημοσ. 24 Ιουνίου 2016 Μέλος Moderators Δημοσ. 24 Ιουνίου 2016 Σωστο αλλα δεν μου περασε καν απο το μυαλο να κανω το παραμικρο για καλυτερο performance ειναι η αληθεια. Ειμαι αρκετα τεμπελης για να το ανεβασω καπου. Καποια στιγμη θα γινει και αυτο παντως. Απλα αυτες τις μερες κοιταω τι βλακειες δουλειες εχω να κανω και φταιχνω σκριπτακια για περασει η ωρα και να κανω τις δουλειες μου γρηγορα -και ισως και καποιος αλλος στο μελλον-. Σε λιγακι θα ανεβασω τον κωδικα με τις τελευταιες αλλαγες ΥΓ: Ανανεωσα το αρχικο ποστ με το νεο κωδικα και νεο λινκ για το νεο exe
pmav99 Δημοσ. 24 Ιουνίου 2016 Δημοσ. 24 Ιουνίου 2016 def dictionary_construction(); Hmm... very suspicious... LETTER_MAP = { 'Α': 'a', 'Ά': 'a', 'Β': 'b', 'Γ': 'g', # ... } class Foo(object): def __init__(self, ): self.letter_map = LETTER_MAP.copy()
Moderators Spect~ Δημοσ. 24 Ιουνίου 2016 Μέλος Moderators Δημοσ. 24 Ιουνίου 2016 η διαφορα? Εννοω τι θα κερδισω αν το κανω ετσι σε σχεση με το πως το εχω τωρα
Silvergrand Δημοσ. 24 Μαΐου 2020 Δημοσ. 24 Μαΐου 2020 Επειδή ψάχνω κάτι τέτοιο, μήπως παίζει να το ανεβάσεις πάλι? ή να μου το στείλεις με we transfer?
k33theod Δημοσ. 24 Μαΐου 2020 Δημοσ. 24 Μαΐου 2020 Την συνάρτηση romanize την είχα γράψει και εγώ παλιότερα. Δεν πειράζει μικρά κεφαλαία εννοώ τα αφήνει ως έχουν και καλύπτει την περίπτωση που το string έχει μικτούς χαρακτήρες ελληνικά και λατινικά δηλαδή. https://github.com/k33theod/greeklish
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα