TSVZ 3.18__py3-none-any.whl → 3.21__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- TSVZ.py +31 -28
- {tsvz-3.18.dist-info → tsvz-3.21.dist-info}/METADATA +1 -1
- tsvz-3.21.dist-info/RECORD +6 -0
- {tsvz-3.18.dist-info → tsvz-3.21.dist-info}/WHEEL +1 -1
- tsvz-3.18.dist-info/RECORD +0 -6
- {tsvz-3.18.dist-info → tsvz-3.21.dist-info}/entry_points.txt +0 -0
- {tsvz-3.18.dist-info → tsvz-3.21.dist-info}/top_level.txt +0 -0
TSVZ.py
CHANGED
|
@@ -22,7 +22,7 @@ if os.name == 'nt':
|
|
|
22
22
|
elif os.name == 'posix':
|
|
23
23
|
import fcntl
|
|
24
24
|
|
|
25
|
-
version = '3.
|
|
25
|
+
version = '3.21'
|
|
26
26
|
__version__ = version
|
|
27
27
|
author = 'pan@zopyr.us'
|
|
28
28
|
|
|
@@ -30,12 +30,13 @@ DEFAULT_DELIMITER = '\t'
|
|
|
30
30
|
DEFAULTS_INDICATOR_KEY = '#_defaults_#'
|
|
31
31
|
|
|
32
32
|
def get_delimiter(delimiter,file_name = ''):
|
|
33
|
+
global DEFAULT_DELIMITER
|
|
33
34
|
if not delimiter:
|
|
34
35
|
return DEFAULT_DELIMITER
|
|
35
36
|
elif delimiter == ...:
|
|
36
37
|
if not file_name:
|
|
37
38
|
rtn = '\t'
|
|
38
|
-
|
|
39
|
+
elif file_name.endswith('.csv'):
|
|
39
40
|
rtn = ','
|
|
40
41
|
elif file_name.endswith('.nsv'):
|
|
41
42
|
rtn = '\0'
|
|
@@ -58,6 +59,7 @@ def get_delimiter(delimiter,file_name = ''):
|
|
|
58
59
|
|
|
59
60
|
def pretty_format_table(data, delimiter = DEFAULT_DELIMITER,header = None):
|
|
60
61
|
version = 1.11
|
|
62
|
+
_ = version
|
|
61
63
|
if not data:
|
|
62
64
|
return ''
|
|
63
65
|
if isinstance(data, str):
|
|
@@ -262,10 +264,10 @@ def __teePrintOrNot(message,level = 'info',teeLogger = None):
|
|
|
262
264
|
teeLogger.teelog(message,level)
|
|
263
265
|
else:
|
|
264
266
|
print(message,flush=True)
|
|
265
|
-
except Exception
|
|
267
|
+
except Exception:
|
|
266
268
|
print(message,flush=True)
|
|
267
269
|
|
|
268
|
-
def _processLine(line,taskDic,correctColumnNum,verbose = False,teeLogger = None,strict = True,delimiter = DEFAULT_DELIMITER,defaults =
|
|
270
|
+
def _processLine(line,taskDic,correctColumnNum,verbose = False,teeLogger = None,strict = True,delimiter = DEFAULT_DELIMITER,defaults = None):
|
|
269
271
|
"""
|
|
270
272
|
Process a line of text and update the task dictionary.
|
|
271
273
|
|
|
@@ -282,6 +284,8 @@ def _processLine(line,taskDic,correctColumnNum,verbose = False,teeLogger = None,
|
|
|
282
284
|
tuple: A tuple containing the updated correctColumnNum and the processed lineCache.
|
|
283
285
|
|
|
284
286
|
"""
|
|
287
|
+
if not defaults:
|
|
288
|
+
defaults = []
|
|
285
289
|
line = line.strip(' ').strip('\x00').rstrip('\r\n')
|
|
286
290
|
# we throw away the lines that start with '#'
|
|
287
291
|
if not line :
|
|
@@ -465,7 +469,7 @@ def _lineContainHeader(header,line,verbose = False,teeLogger = None,strict = Fal
|
|
|
465
469
|
if len(header) != len(line) or any([header[i] not in line[i] for i in range(len(header))]):
|
|
466
470
|
__teePrintOrNot(f"Header mismatch: \n{line} \n!= \n{header}",teeLogger=teeLogger)
|
|
467
471
|
if strict:
|
|
468
|
-
raise
|
|
472
|
+
raise ValueError("Data format error! Header mismatch")
|
|
469
473
|
return False
|
|
470
474
|
return True
|
|
471
475
|
|
|
@@ -500,7 +504,7 @@ def _verifyFileExistence(fileName,createIfNotExist = True,teeLogger = None,heade
|
|
|
500
504
|
return True
|
|
501
505
|
elif strict:
|
|
502
506
|
__teePrintOrNot('File not found','error',teeLogger=teeLogger)
|
|
503
|
-
raise
|
|
507
|
+
raise FileNotFoundError("File not found")
|
|
504
508
|
else:
|
|
505
509
|
return False
|
|
506
510
|
return True
|
|
@@ -566,8 +570,7 @@ def readTabularFile(fileName,teeLogger = None,header = '',createIfNotExist = Fal
|
|
|
566
570
|
return taskDic
|
|
567
571
|
with open(fileName, mode ='rb')as file:
|
|
568
572
|
correctColumnNum = -1
|
|
569
|
-
if header.rstrip():
|
|
570
|
-
if verifyHeader:
|
|
573
|
+
if header.rstrip() and verifyHeader:
|
|
571
574
|
line = file.readline().decode(encoding=encoding)
|
|
572
575
|
if _lineContainHeader(header,line,verbose = verbose,teeLogger = teeLogger,strict = strict):
|
|
573
576
|
correctColumnNum = len(header.split(delimiter))
|
|
@@ -660,13 +663,12 @@ def appendLinesTabularFile(fileName,linesToAppend,teeLogger = None,header = '',c
|
|
|
660
663
|
except Exception as e:
|
|
661
664
|
line[i] = str(e)
|
|
662
665
|
if isinstance(linesToAppend,dict):
|
|
663
|
-
if not line or line[0] != key:
|
|
666
|
+
if (not line or line[0] != key):
|
|
664
667
|
line = [key]+line
|
|
665
668
|
formatedLines.append(line)
|
|
666
669
|
with open(fileName, mode ='r+b')as file:
|
|
667
670
|
correctColumnNum = max([len(line) for line in formatedLines])
|
|
668
|
-
if header.rstrip():
|
|
669
|
-
if verifyHeader:
|
|
671
|
+
if header.rstrip() and verifyHeader:
|
|
670
672
|
line = file.readline().decode(encoding=encoding)
|
|
671
673
|
if _lineContainHeader(header,line,verbose = verbose,teeLogger = teeLogger,strict = strict):
|
|
672
674
|
correctColumnNum = len(header.split(delimiter))
|
|
@@ -716,7 +718,7 @@ def clearTabularFile(fileName,teeLogger = None,header = '',verifyHeader = False,
|
|
|
716
718
|
delimiter = get_delimiter(delimiter,file_name=fileName)
|
|
717
719
|
header = _formatHeader(header,verbose = verbose,teeLogger = teeLogger,delimiter=delimiter)
|
|
718
720
|
if not _verifyFileExistence(fileName,createIfNotExist = True,teeLogger = teeLogger,header = header,encoding = encoding,strict = False,delimiter=delimiter):
|
|
719
|
-
raise
|
|
721
|
+
raise FileNotFoundError("Something catastrophic happened! File still not found after creation")
|
|
720
722
|
else:
|
|
721
723
|
with open(fileName, mode ='r+',encoding=encoding)as file:
|
|
722
724
|
if header.rstrip() and verifyHeader:
|
|
@@ -754,13 +756,13 @@ class TSVZed(OrderedDict):
|
|
|
754
756
|
self.teeLogger.teelog(message,level)
|
|
755
757
|
else:
|
|
756
758
|
print(message,flush=True)
|
|
757
|
-
except Exception
|
|
759
|
+
except Exception:
|
|
758
760
|
print(message,flush=True)
|
|
759
761
|
|
|
760
762
|
def getResourseUsage(self,return_dict = False):
|
|
761
763
|
return get_resource_usage(return_dict = return_dict)
|
|
762
764
|
|
|
763
|
-
def __init__ (self,fileName,teeLogger = None,header = '',createIfNotExist = True,verifyHeader = True,rewrite_on_load = True,rewrite_on_exit = False,rewrite_interval = 0, append_check_delay = 0.01,monitor_external_changes = True,verbose = False,encoding = 'utf8',delimiter = ...,defualts =
|
|
765
|
+
def __init__ (self,fileName,teeLogger = None,header = '',createIfNotExist = True,verifyHeader = True,rewrite_on_load = True,rewrite_on_exit = False,rewrite_interval = 0, append_check_delay = 0.01,monitor_external_changes = True,verbose = False,encoding = 'utf8',delimiter = ...,defualts = None,strict = False):
|
|
764
766
|
super().__init__()
|
|
765
767
|
self.version = version
|
|
766
768
|
self.strict = strict
|
|
@@ -769,7 +771,7 @@ class TSVZed(OrderedDict):
|
|
|
769
771
|
self._fileName = fileName
|
|
770
772
|
self.teeLogger = teeLogger
|
|
771
773
|
self.delimiter = get_delimiter(delimiter,file_name=fileName)
|
|
772
|
-
self.defaults = defualts
|
|
774
|
+
self.defaults = defualts if defualts else []
|
|
773
775
|
self.header = _formatHeader(header,verbose = verbose,teeLogger = self.teeLogger,delimiter=self.delimiter)
|
|
774
776
|
self.correctColumnNum = -1
|
|
775
777
|
self.createIfNotExist = createIfNotExist
|
|
@@ -835,7 +837,12 @@ class TSVZed(OrderedDict):
|
|
|
835
837
|
readTabularFile(self._fileName, teeLogger = self.teeLogger, header = self.header, createIfNotExist = self.createIfNotExist, verifyHeader = self.verifyHeader, verbose = self.verbose, taskDic = self,encoding = self.encoding if self.encoding else None, strict = self.strict, delimiter = self.delimiter, defaults=self.defaults)
|
|
836
838
|
if self.verbose:
|
|
837
839
|
self.__teePrintOrNot(f"Loaded {len(self)} records from {self._fileName}")
|
|
838
|
-
|
|
840
|
+
if self.header and self.verifyHeader:
|
|
841
|
+
self.correctColumnNum = len(self.header.split(self.delimiter))
|
|
842
|
+
elif self:
|
|
843
|
+
self.correctColumnNum = len(self[next(iter(self))])
|
|
844
|
+
else:
|
|
845
|
+
self.correctColumnNum = -1
|
|
839
846
|
if self.verbose:
|
|
840
847
|
self.__teePrintOrNot(f"correctColumnNum: {self.correctColumnNum}")
|
|
841
848
|
#super().update(loadedData)
|
|
@@ -1001,9 +1008,12 @@ class TSVZed(OrderedDict):
|
|
|
1001
1008
|
def __enter__(self):
|
|
1002
1009
|
return self
|
|
1003
1010
|
|
|
1004
|
-
def
|
|
1011
|
+
def close(self):
|
|
1005
1012
|
self.stopAppendThread()
|
|
1006
1013
|
return self
|
|
1014
|
+
|
|
1015
|
+
def __exit__(self,exc_type,exc_value,traceback):
|
|
1016
|
+
return self.close()
|
|
1007
1017
|
|
|
1008
1018
|
def __repr__(self):
|
|
1009
1019
|
return f"""TSVZed(
|
|
@@ -1024,16 +1034,11 @@ deSynced:{self.deSynced}
|
|
|
1024
1034
|
memoryOnly:{self.memoryOnly}
|
|
1025
1035
|
{dict(self)})"""
|
|
1026
1036
|
|
|
1027
|
-
def close(self):
|
|
1028
|
-
self.stopAppendThread()
|
|
1029
|
-
return self
|
|
1030
|
-
|
|
1031
1037
|
def __str__(self):
|
|
1032
1038
|
return f"TSVZed({self._fileName},{dict(self)})"
|
|
1033
1039
|
|
|
1034
1040
|
def __del__(self):
|
|
1035
|
-
self.
|
|
1036
|
-
return self
|
|
1041
|
+
return self.close()
|
|
1037
1042
|
|
|
1038
1043
|
def popitem(self, last=True):
|
|
1039
1044
|
key, value = super().popitem(last)
|
|
@@ -1359,14 +1364,14 @@ def __main__():
|
|
|
1359
1364
|
args.header += '\\'
|
|
1360
1365
|
try:
|
|
1361
1366
|
header = args.header.encode().decode('unicode_escape') if args.header else ''
|
|
1362
|
-
except Exception
|
|
1367
|
+
except Exception:
|
|
1363
1368
|
print(f"Failed to decode header: {args.header}")
|
|
1364
1369
|
header = ''
|
|
1365
1370
|
defaults = []
|
|
1366
1371
|
if args.defaults:
|
|
1367
1372
|
try:
|
|
1368
1373
|
defaults = args.defaults.encode().decode('unicode_escape').split(args.delimiter)
|
|
1369
|
-
except Exception
|
|
1374
|
+
except Exception:
|
|
1370
1375
|
print(f"Failed to decode defaults: {args.defaults}")
|
|
1371
1376
|
defaults = []
|
|
1372
1377
|
|
|
@@ -1385,9 +1390,7 @@ def __main__():
|
|
|
1385
1390
|
elif args.operation == 'clear':
|
|
1386
1391
|
clearTabularFile(args.filename, header=header, verbose=args.verbose, verifyHeader=args.strict, delimiter=args.delimiter)
|
|
1387
1392
|
else:
|
|
1388
|
-
print("Invalid operation")
|
|
1389
|
-
return
|
|
1390
|
-
|
|
1393
|
+
print("Invalid operation")
|
|
1391
1394
|
if __name__ == '__main__':
|
|
1392
1395
|
__main__()
|
|
1393
1396
|
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
TSVZ.py,sha256=eRZASSHRWU-POztnPYvqZq9ufarsBq65VAnVQ2RB9vY,68436
|
|
2
|
+
tsvz-3.21.dist-info/METADATA,sha256=OFhlK4nFVUhqiBS9L9rpg8WPwcP0in8eKlyT2qps9PQ,1826
|
|
3
|
+
tsvz-3.21.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
|
|
4
|
+
tsvz-3.21.dist-info/entry_points.txt,sha256=WeXidyV5yKCRLaVsnAY35xGa08QgytOfvr1CK9aescI,60
|
|
5
|
+
tsvz-3.21.dist-info/top_level.txt,sha256=OPx4LvOpaYykaos7oL_jGaObSWXxLzhHiWLuz-K147g,5
|
|
6
|
+
tsvz-3.21.dist-info/RECORD,,
|
tsvz-3.18.dist-info/RECORD
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
TSVZ.py,sha256=-1ciQsohzOZcZ8iYmlfw4JgFfUQBurV5104tpM26F9U,68319
|
|
2
|
-
tsvz-3.18.dist-info/METADATA,sha256=CGX-YrNOsZvau2hgduwOLbnXozNEqAEMP355LIli5sE,1826
|
|
3
|
-
tsvz-3.18.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
|
|
4
|
-
tsvz-3.18.dist-info/entry_points.txt,sha256=WeXidyV5yKCRLaVsnAY35xGa08QgytOfvr1CK9aescI,60
|
|
5
|
-
tsvz-3.18.dist-info/top_level.txt,sha256=OPx4LvOpaYykaos7oL_jGaObSWXxLzhHiWLuz-K147g,5
|
|
6
|
-
tsvz-3.18.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|