-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathlc.py
169 lines (140 loc) · 4.8 KB
/
lc.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
import csv
import json
import os
import time
"""
Versión usando POO (Programació Orientada a Objetos)
"""
class Elemento():
def __init__(self, ruta):
""" El constructor del objeto Elemento """
# Definición y asignación de atributos
if not os.path.exists(ruta):
raise FileNotFoundError(
f"La carpeta {ruta} no existe!")
self.nombre = ruta
self.tamanio = self.obtener_tamanio()
self.fecha = self.obtener_fecha()
def obtener_fecha(self):
""" Obtener la fecha del elemento """
try:
fecha = os.path.getmtime(self.nombre)
fecha = time.ctime(fecha)
except FileNotFoundError:
fecha = ""
except PermissionError:
fecha = ""
return fecha
def obtener_tamanio(self):
""" Obtiene el tamaño del elemento """
if os.path.isfile(self.nombre):
tam = os.path.getsize(self.nombre)
else: # es una carpeta
tam = 0
return tam
def __str__(self):
""" Regresa la versión en str de Elemento """
return "{:10} | {:15} | {}".format(
self.tamanio, self.fecha, self.nombre)
class Archivo(Elemento):
def __init__(self, ruta):
""" Iinicializar objeto de tipo Archivo() """
Elemento.__init__(self, ruta)
class Carpeta(Elemento):
def __init__(self, ruta):
""" """
Elemento.__init__(self, ruta)
self.elementos = []
# self.elementos = self.obtener_elementos()
self.total = 0
def obtener_elementos(self):
"""
Obtiene los elementos de la carpeta y regresa en forma de
lista
"""
# Obtener la lista de elemento de un carpeta
try:
nombres = os.listdir(self.nombre)
except PermissionError:
return
# Agregando carpeta a la lista de nombres
nombres = [os.path.join(self.nombre, nom) for nom in nombres]
# Agregar los datos adicionales a cada elemento
for nom in nombres:
if os.path.isdir(nom): # Si nom es una carpeta?
carpeta = Carpeta(nom)
self.elementos.append(carpeta)
else:
archivo = Archivo(nom)
self.elementos.append(archivo)
self.tamanio += archivo.tamanio
self.total += self.tamanio
def __str__(self):
""" Regresa la versión en str de Elemento """
return Elemento.__str__(self) + os.path.sep
def imprimir_elementos(carpeta):
"""
Imprime la lista de elementos en formato texto en la salida
estándar de los elementos de carpeta.
"""
print(carpeta)
for e in carpeta.elementos:
if isinstance(e, Archivo):
print(e) # def __str__()
else: # e es un objeto Carpeta()
e.obtener_elementos()
imprimir_elementos(e)
def guardar_elementos(elementos):
"""
Guarda la lista de elementos en el archivo salida.txt.
"""
archivo = "salida.txt"
da = open(archivo, "w")
# Imprimir la lista
da.write("-" * 80 + "\n")
for e in elementos: # e = ["nom", 1234, "fecha"]
# print("{} {}".format(e[0], e[1])
if os.path.isdir(e[0]): # e = ["nom/", 1234, "fecha"]
e[0] += "/" # e[0] = e[0] + "/"
print("{:10} | {:15} | {}".format(*e), file=da)
print("-" * 80, file=da)
da.close()
def guardar_elementos_csv(elementos):
"""
Guarda la lista de elementos en el archivo salida.csv.
"""
archivo = "salida.csv"
with open(archivo, "w") as da:
# Crear un descript de archivo en csv
da_csv = csv.writer(da)
# Guarda el encabezado
enc = ["Tamaño", "Fecha","Nombre"]
da_csv.writerow(enc)
# Guardar la lista
for e in elementos: # e = [1234,"fecha","nom"]
# print("{} {}".format(e[0], e[1])
if os.path.isdir(e[2]): # e = [1234, "fecha","nom/"]
e[2] += "/" # e[3] = e[3] + "/"
da_csv.writerow(e)
def guardar_elementos_json(elementos):
"""
Guarda la lista de elementos en el archivo salida.json.
"""
archivo = "salida.json"
with open(archivo, "w") as da:
json.dump(elementos, da, indent=4)
# MVC: Controlador
def main():
""" Es la función principal del script o módulo """
# Variables
ruta = ".." # Carpeta actual
# Instanciar objetos
carpeta = Carpeta(ruta) # carpeta es de tipo Carpeta()
carpeta.obtener_elementos()
imprimir_elementos(carpeta)
# guardar_elementos(carpeta.elementos)
# guardar_elementos_csv(carpeta.elementos)
# guardar_elementos_json(carpeta.elementos)
# Para poder ejecutarlo como módulo
if __name__ == "__main__":
main()