forked from J-Rios/TLG_JoinCaptchaBot
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtsjson.py
More file actions
249 lines (205 loc) · 13.1 KB
/
Copy pathtsjson.py
File metadata and controls
249 lines (205 loc) · 13.1 KB
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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
# -*- coding: utf-8 -*-
'''
Script:
tsjson.py
Description:
Thread-Safe json files read/write library
Author:
Jose Miguel Rios Rubio
Creation date:
20/07/2017
Last modified date:
25/08/2017
Version:
1.2.0
'''
###############################################################################
### Modulos importados
import os
import json
from threading import Lock
from collections import OrderedDict
###############################################################################
### Clase
class TSjson(object):
'''
Thread-Safe json files read/write library
'''
def __init__(self, file_name):
'''Constructor de la clase'''
self.lock = Lock() #Inicializa el Lock
self.file_name = file_name # Adquiere el nombre del archivo a controlar
def read(self):
'''Funcion para leer de un archivo json'''
try: # Intentar abrir el archivo
self.lock.acquire() # Cerramos (adquirimos) el mutex
if not os.path.exists(self.file_name): # Si el archivo no existe
read = {} # Devolver un diccionario vacio
else: # Si el archivo existe
if not os.stat(self.file_name).st_size: # Si el archivo esta vacio
read = {} # Devolver un diccionario vacio
else: # El archivo existe y tiene contenido
with open(self.file_name, "r", encoding="utf-8") as f: # Abrir el archivo en modo lectura
read = json.load(f, object_pairs_hook=OrderedDict) # Leer todo el archivo y devolver la lectura de los datos json usando un diccionario ordenado
except Exception as e: # Error intentando abrir el archivo
print(" Error reading json file {}. {}".format(self.file_name, str(e))) # Escribir en consola el error
read = None # Devolver None
finally: # Para acabar, haya habido excepcion o no
self.lock.release() # Abrimos (liberamos) el mutex
return read # Devolver el resultado de la lectura de la funcion
def write(self, data):
'''Funcion para escribir en un archivo json'''
# Si no existe el directorio que contiene los archivos de datos, lo creamos
directory = os.path.dirname(self.file_name) # Obtener el nombre del directorio que contiene al archivo
if not os.path.exists(directory): # Si el directorio (ruta) no existe
os.makedirs(directory) # Creamos el directorio
try: # Intentar abrir el archivo
self.lock.acquire() # Cerramos (adquirimos) el mutex
with open(self.file_name, 'w', encoding="utf-8") as f: # Abrir el archivo en modo escritura (sobre-escribe)
json.dump(data, fp=f, ensure_ascii=False, indent=4) # Escribimos en el archivo los datos json asegurando todos los caracteres ascii, codificacion utf-8 y una "indentacion" de 4 espacios
except: # Error intentando abrir el archivo
print(" Error cuando se abria para escritura, el archivo {}".format(self.file_name)) # Escribir en consola el error
finally: # Para acabar, haya habido excepcion o no
self.lock.release() # Abrimos (liberamos) el mutex
def read_content(self):
'''Funcion para leer el contenido de un archivo json (datos json)'''
read = self.read() # Leer todo el archivo json
if read != {}: # Si la lectura no es vacia
return read['Content'] # Devolvemos el contenido de la lectura (datos json)
else: # Lectura vacia
return read # Devolvemos la lectura vacia
def write_content(self, data):
'''Funcion para añadir al contenido de un archivo json, nuevos datos json'''
# Si no existe el directorio que contiene los archivos de datos, lo creamos
directory = os.path.dirname(self.file_name) # Obtener el nombre del directorio que contiene al archivo
if not os.path.exists(directory): # Si el directorio (ruta) no existe
os.makedirs(directory) # Creamos el directorio
try: # Intentar abrir el archivo
self.lock.acquire() # Cerramos (adquirimos) el mutex
if data: # Si el dato no esta vacio
if os.path.exists(self.file_name) and os.stat(self.file_name).st_size: # Si el archivo existe y no esta vacio
with open(self.file_name, "r", encoding="utf-8") as f: # Abrir el archivo en modo lectura
content = json.load(f, object_pairs_hook=OrderedDict) # Leer todo el archivo y devolver la lectura de los datos json usando un diccionario ordenado
content['Content'].append(data) # Añadir los nuevos datos al contenido del json
with open(self.file_name, 'w', encoding="utf-8") as f: # Abrir el archivo en modo escritura (sobre-escribe)
json.dump(content, fp=f, ensure_ascii=False, indent=4)
else: # El archivo no existe o esta vacio
with open(self.file_name, 'w', encoding="utf-8") as f: # Abrir el archivo en modo escritura (sobre-escribe)
f.write('\n{\n "Content": []\n}\n') # Escribir la estructura de contenido basica
with open(self.file_name, "r", encoding="utf-8") as f: # Abrir el archivo en modo lectura
content = json.load(f) # Leer todo el archivo
content['Content'].append(data) # Añadir los datos al contenido del json
with open(self.file_name, 'w', encoding="utf-8") as f: # Abrir el archivo en modo escritura (sobre-escribe)
json.dump(content, fp=f, ensure_ascii=False, indent=4)
except IOError as e:
print(" I/O error({0}): {1}".format(e.errno, e.strerror))
except ValueError:
print(" Error en conversion de dato")
except: # Error intentando abrir el archivo
print(" Error cuando se abria para escritura, el archivo {}".format(self.file_name)) # Escribir en consola el error
finally: # Para acabar, haya habido excepcion o no
self.lock.release() # Abrimos (liberamos) el mutex
def is_in(self, data):
'''Funcion para determinar si el archivo json contiene un dato json concreto'''
found = False # Dato inicialmente no encontrado
file_data = self.read() # Leer todo el archivo json
for _data in file_data['Content']: # Para cada dato en el archivo json
if data == _data: # Si el contenido del json tiene dicho dato
found = True # Marcar que se ha encontrado la posicion
break # Interrumpir y salir del bucle
return found
def is_in_position(self, data):
'''Funcion para determinar si el archivo json contiene un dato json concreto y la posicion de este'''
found = False # Dato inicialmente no encontrado
i = 0 # Posicion inicial del dato a 0
file_data = self.read() # Leer todo el archivo json
for _data in file_data['Content']: # Para cada dato en el archivo json
if data == _data: # Si el contenido del json tiene dicho dato
found = True # Marcar que se ha encontrado la posicion
break # Interrumpir y salir del bucle
i = i + 1 # Incrementar la posicion del dato
return found, i # Devolvemos la tupla (encontrado, posicion)
def remove_by_uide(self, element_value, uide):
'''
Funcion para eliminar un dato json concreto dentro del archivo json a partir de un elemento identificador unico (uide)
[Nota: Cada dato json necesita al menos 1 elemento identificador unico (uide), si no es asi, la eliminacion se producira en el primer dato con dicho elemento uide que se encuentre]
'''
file_content = self.read_content() # Leer el contenido del archivo json
for data in file_content: # Para cada dato json contenido
if data[uide] == element_value: # Si el dato coincide con el buscado
file_content.remove(data) # Eliminamos el dato
break # Interrumpir y salir del bucle
self.clear_content() # Eliminamos el contenido del archivo
if file_content: # Si hay algun dato en el contenido modificado
self.write_content(file_content[0]) # Write the modified content (without the item)
def search_by_uide(self, element_value, uide):
'''
Funcion para buscar un dato json concreto dentro del archivo json a partir de un elemento identificador unico (uide)
[Nota: Cada dato json necesita al menos 1 elemento identificador unico (uide), si no es asi, la actualizacion se producira en el primer dato con dicho elemento uide que se encuentre]
'''
result = dict() # Diccionario para el resultado de la busqueda
result['found'] = False # Dato inicialmente no encontrado
result['data'] = None # Dato encontrado inicialmente con ningun valor
file_data = self.read() # Leer todo el archivo json
for element in file_data['Content']: # Para cada elemento en el archivo json
if element: # Si el contenido no esta vacio
if element_value == element[uide]: # Si el dato json tiene el UIDE buscado
result['found'] = True # Marcar que se ha encontrado la posicion
result['data'] = element # Obtenemos el dato encontrado
break # Interrumpir y salir del bucle
return result # Devolver si se ha encontrado o no y el dato encontrado
def update(self, data, uide):
'''
Funcion para actualizar datos de un archivo json
[Nota: Cada dato json necesita al menos 1 elemento identificador unico (uide), si no es asi, la actualizacion se producira en el primer dato con dicho elemento uide que se encuentre]
'''
file_data = self.read() # Leer todo el archivo json
# Buscar la posicion del dato en el contenido json
found = 0 # Posicion encontrada a 0
i = 0 # Posicion inicial del dato a 0
for msg in file_data['Content']: # Para cada dato json en el archivo json
if data[uide] == msg[uide]: # Si el dato json tiene el UIDE buscado
found = 1 # Marcar que se ha encontrado la posicion
break # Interrumpir y salir del bucle
i = i + 1 # Incrementar la posicion del dato
if found: # Si se encontro en el archivo json datos con el UIDE buscado
file_data['Content'][i] = data # Actualizamos los datos json que contiene ese UIDE
self.write(file_data) # Escribimos el dato actualizado en el archivo json
else: # No se encontro ningun dato json con dicho UIDE
print(" Error: UIDE no encontrado en el archivo, o el archivo no existe") # Escribir en consola el error
def update_twice(self, data, uide1, uide2):
'''
Funcion para actualizar datos de un archivo json
[Nota: Cada dato json necesita al menos 1 elemento identificador unico (uide), si no es asi, la actualizacion se producira en el primer elemento que se encuentre]
'''
file_data = self.read() # Leer todo el archivo json
# Buscar la posicion del dato en el contenido json
found = 0 # Posicion encontrada a 0
i = 0 # Posicion inicial del dato a 0
for msg in file_data['Content']: # Para cada dato json en el archivo json
if (data[uide1] == msg[uide1]) and (data[uide2] == msg[uide2]): # Si el dato json tiene el UIDE buscado
found = 1 # Marcar que se ha encontrado la posicion
break # Interrumpir y salir del bucle
i = i + 1 # Incrementar la posicion del dato
if found: # Si se encontro en el archivo json datos con el UIDE buscado
file_data['Content'][i] = data # Actualizamos los datos json que contiene ese UIDE
self.write(file_data) # Escribimos el dato actualizado en el archivo json
else: # No se encontro ningun dato json con dicho UIDE
print(" Error: UIDE no encontrado en el archivo, o el archivo no existe") # Escribir en consola el error
def clear_content(self):
'''Funcion para limpiar todos los datos de un archivo json'''
try: # Intentar abrir el archivo
self.lock.acquire() # Cerramos (adquirimos) el mutex
if os.path.exists(self.file_name) and os.stat(self.file_name).st_size: # Si el archivo existe y no esta vacio
with open(self.file_name, 'w', encoding="utf-8") as f: # Abrir el archivo en modo escritura (sobre-escribe)
f.write('\n{\n "Content": [\n ]\n}\n') # Escribir la estructura de contenido basica
except: # Error intentando abrir el archivo
print(" Error cuando se abria para escritura, el archivo {}".format(self.file_name)) # Escribir en consola el error
finally: # Para acabar, haya habido excepcion o no
self.lock.release() # Abrimos (liberamos) el mutex
def delete(self):
'''Funcion para eliminar un archivo json'''
self.lock.acquire() # Cerramos (adquirimos) el mutex
if os.path.exists(self.file_name): # Si el archivo existe
os.remove(self.file_name) # Eliminamos el archivo
self.lock.release() # Abrimos (liberamos) el mutex