Skip to content

Commit 8a1a593

Browse files
committed
Adding support for gzipped ASC logging file
1 parent 4db969d commit 8a1a593

File tree

5 files changed

+57
-5
lines changed

5 files changed

+57
-5
lines changed

can/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
)
2626

2727
from .io import Logger, SizedRotatingLogger, Printer, LogReader, MessageSync
28-
from .io import ASCWriter, ASCReader
28+
from .io import ASCWriter, ASCReader, CompressedASCWriter, CompressedASCReader
2929
from .io import BLFReader, BLFWriter
3030
from .io import CanutilsLogReader, CanutilsLogWriter
3131
from .io import CSVWriter, CSVReader

can/io/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from .player import LogReader, MessageSync
99

1010
# Format specific
11-
from .asc import ASCWriter, ASCReader
11+
from .asc import ASCWriter, ASCReader, CompressedASCWriter, CompressedASCReader
1212
from .blf import BLFReader, BLFWriter
1313
from .canutils import CanutilsLogReader, CanutilsLogWriter
1414
from .csv import CSVWriter, CSVReader

can/io/asc.py

+49-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
- https://bitbucket.org/tobylorenz/vector_asc/src/47556e1a6d32c859224ca62d075e1efcc67fa690/src/Vector/ASC/tests/unittests/data/CAN_Log_Trigger_3_2.asc?at=master&fileviewer=file-view-default
66
- under `test/data/logfile.asc`
77
"""
8-
8+
import gzip
99
from typing import cast, Any, Generator, IO, List, Optional, Dict
1010

1111
from datetime import datetime
@@ -396,3 +396,51 @@ def on_message_received(self, msg: Message) -> None:
396396
data=" ".join(data),
397397
)
398398
self.log_event(serialized, msg.timestamp)
399+
400+
401+
class CompressedASCReader(ASCReader):
402+
"""Gzipped version of :class:`~can.ASCReader`"""
403+
404+
def __init__(
405+
self,
406+
file: Union[typechecking.FileLike, typechecking.StringPathLike],
407+
base: str = "hex",
408+
relative_timestamp: bool = True,
409+
):
410+
"""
411+
:param file: a path-like object or as file-like object to read from
412+
If this is a file-like object, is has to opened in text
413+
read mode, not binary read mode.
414+
:param base: Select the base(hex or dec) of id and data.
415+
If the header of the asc file contains base information,
416+
this value will be overwritten. Default "hex".
417+
:param relative_timestamp: Select whether the timestamps are
418+
`relative` (starting at 0.0) or `absolute` (starting at
419+
the system time). Default `True = relative`.
420+
"""
421+
super(CompressedASCReader, self).__init__(
422+
gzip.open(file, mode="rt"), base, relative_timestamp
423+
)
424+
425+
426+
class CompressedASCWriter(ASCWriter):
427+
"""Gzipped version of :class:`~can.ASCWriter`"""
428+
429+
def __init__(
430+
self,
431+
file: Union[typechecking.FileLike, typechecking.StringPathLike],
432+
channel: int = 1,
433+
compresslevel: int = 6,
434+
):
435+
"""
436+
:param file: a path-like object or as file-like object to write to
437+
If this is a file-like object, is has to opened in text
438+
write mode, not binary write mode.
439+
:param channel: a default channel to use when the message does not
440+
have a channel set
441+
:param compresslevel: Gzip compresslevel, see
442+
:class:`~gzip.GzipFile` for details. The default is 6.
443+
"""
444+
super(CompressedASCWriter, self).__init__(
445+
gzip.open(file, mode="wt", compresslevel=compresslevel), channel
446+
)

can/io/logger.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
from ..message import Message
2222
from ..listener import Listener
2323
from .generic import BaseIOHandler, FileIOMessageWriter
24-
from .asc import ASCWriter
24+
from .asc import ASCWriter, CompressedASCWriter
2525
from .blf import BLFWriter
2626
from .canutils import CanutilsLogWriter
2727
from .csv import CSVWriter
@@ -36,6 +36,7 @@ class Logger(BaseIOHandler, Listener): # pylint: disable=abstract-method
3636
3737
The format is determined from the file format which can be one of:
3838
* .asc: :class:`can.ASCWriter`
39+
* .asc.gz: :class:`can.CompressedASCWriter`
3940
* .blf :class:`can.BLFWriter`
4041
* .csv: :class:`can.CSVWriter`
4142
* .db: :class:`can.SqliteWriter`
@@ -54,6 +55,7 @@ class Logger(BaseIOHandler, Listener): # pylint: disable=abstract-method
5455
fetched_plugins = False
5556
message_writers = {
5657
".asc": ASCWriter,
58+
".asc,gz": CompressedASCWriter,
5759
".blf": BLFWriter,
5860
".csv": CSVWriter,
5961
".db": SqliteWriter,

can/io/player.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import can
1515

1616
from .generic import BaseIOHandler, MessageReader
17-
from .asc import ASCReader
17+
from .asc import ASCReader, CompressedASCReader
1818
from .blf import BLFReader
1919
from .canutils import CanutilsLogReader
2020
from .csv import CSVReader
@@ -27,6 +27,7 @@ class LogReader(BaseIOHandler):
2727
2828
The format is determined from the file format which can be one of:
2929
* .asc
30+
* .asc.gz
3031
* .blf
3132
* .csv
3233
* .db
@@ -49,6 +50,7 @@ class LogReader(BaseIOHandler):
4950
fetched_plugins = False
5051
message_readers = {
5152
".asc": ASCReader,
53+
".asc.gz": CompressedASCReader,
5254
".blf": BLFReader,
5355
".csv": CSVReader,
5456
".db": SqliteReader,

0 commit comments

Comments
 (0)