Fast Python reader and editor for ASAM MDF / MF4 (Measurement Data Format) files

asammdf is a fast parser and editor for ASAM (Association for Standardization of Automation and Measuring Systems) MDF (Measurement Data Format) files.

asammdf supports MDF versions 2 (.dat), 3 (.mdf) and 4 (.mf4).

asammdf works on Python >= 3.7 (for Python 2.7, 3.4 and 3.5 see the 4.x.y releases)

Status

Continuous Integration Coveralls Codacy ReadTheDocs
continuous integration Coverage Status Codacy Badge Documentation Status
PyPI conda-forge
PyPI version conda-forge version

Project goals

The main goals for this library are:

  • to be faster than the other Python based mdf libraries
  • to have clean and easy to understand code base
  • to have minimal 3-rd party dependencies

Features

  • create new mdf files from scratch

  • append new channels

  • read unsorted MDF v3 and v4 files

  • read CAN and LIN bus logging files

  • extract CAN and LIN signals from anonymous bus logging measurements

  • filter a subset of channels from original mdf file

  • cut measurement to specified time interval

  • convert to different mdf version

  • export to HDF5, Matlab (v4, v5 and v7.3), CSV and parquet

  • merge multiple files sharing the same internal structure

  • read and save mdf version 4.10 files containing zipped data blocks

  • space optimizations for saved files (no duplicated blocks)

  • split large data blocks (configurable size) for mdf version 4

  • full support (read, append, save) for the following map types (multidimensional array channels):

    • mdf version 3 channels with CDBLOCK

    • mdf version 4 structure channel composition

    • mdf version 4 channel arrays with CNTemplate storage and one of the array types:

      • 0 - array
      • 1 - scaling axis
      • 2 - look-up
  • add and extract attachments for mdf version 4

  • handle large files (for example merging two fileas, each with 14000 channels and 5GB size, on a RaspberryPi)

  • extract channel data, master channel and extra channel information as Signal objects for unified operations with v3 and v4 files

  • time domain operation using the Signal class

    • Pandas data frames are good if all the channels have the same time based
    • a measurement will usually have channels from different sources at different rates
    • the Signal class facilitates operations with such channels
  • graphical interface to visualize channels and perform operations with the files

Major features not implemented (yet)

  • for version 3

    • functionality related to sample reduction block: the samples reduction blocks are simply ignored
  • for version 4

    • experimental support for MDF v4.20 column oriented storage
    • functionality related to sample reduction block: the samples reduction blocks are simply ignored
    • handling of channel hierarchy: channel hierarchy is ignored
    • full handling of bus logging measurements: currently only CAN and LIN bus logging are implemented with the ability to get signals defined in the attached CAN/LIN database (.arxml or .dbc). Signals can also be extracted from an anonymous bus logging measurement by providing a CAN or LIN database (.dbc or .arxml)
    • handling of unfinished measurements (mdf 4): finalization is attempted when the file is loaded, however the not all the finalization steps are supported
    • full support for remaining mdf 4 channel arrays types
    • xml schema for MDBLOCK: most metadata stored in the comment blocks will not be available
    • full handling of event blocks: events are transferred to the new files (in case of calling methods that return new MDF objects) but no new events can be created
    • channels with default X axis: the default X axis is ignored and the channel group's master channel is used
    • attachment encryption/decryption using user provided encryption/decryption functions; this is not part of the MDF v4 spec and is only supported by this library

Usage

from asammdf import MDF

mdf = MDF('sample.mdf')
speed = mdf.get('WheelSpeed')
speed.plot()

important_signals = ['WheelSpeed', 'VehicleSpeed', 'VehicleAcceleration']
# get short measurement with a subset of channels from 10s to 12s
short = mdf.filter(important_signals).cut(start=10, stop=12)

# convert to version 4.10 and save to disk
short.convert('4.10').save('important signals.mf4')

# plot some channels from a huge file
efficient = MDF('huge.mf4')
for signal in efficient.select(['Sensor1', 'Voltage3']):
   signal.plot()

Check the examples folder for extended usage demo, or the documentation http://asammdf.readthedocs.io/en/master/examples.html

https://canlogger.csselectronics.com/canedge-getting-started/log-file-tools/asammdf-api/

Documentation

http://asammdf.readthedocs.io/en/master

And a nicely written tutorial on the CSS Electronics site

Contributing & Support

Please have a look over the contributing guidelines

If you enjoy this library please consider making a donation to the numpy project or to danielhrisca using liberapay Donate using Liberapay

Contributors

Thanks to all who contributed with commits to asammdf:

Installation

asammdf is available on

pip install asammdf
# for the GUI 
pip install asammdf[gui]
# or for anaconda
conda install -c conda-forge asammdf

In case a wheel is not present for you OS/Python versions and you lack the proper compiler setup to compile the c-extension code, then you can simply copy-paste the package code to your site-packages. In this way the python fallback code will be used instead of the compiled c-extension code.

Dependencies

asammdf uses the following libraries

  • numpy : the heart that makes all tick
  • numexpr : for algebraic and rational channel conversions
  • wheel : for installation in virtual environments
  • pandas : for DataFrame export
  • canmatrix : to handle CAN/LIN bus logging measurements
  • natsort
  • lxml : for canmatrix arxml support
  • lz4 : to speed up the disk IO performance

optional dependencies needed for exports

  • h5py : for HDF5 export
  • scipy : for Matlab v4 and v5 .mat export
  • hdf5storage : for Matlab v7.3 .mat export
  • fastparquet : for parquet export

other optional dependencies

  • PyQt5 : for GUI tool
  • pyqtgraph : for GUI tool and Signal plotting
  • matplotlib : as fallback for Signal plotting
  • cChardet : to detect non-standard Unicode encodings
  • chardet : to detect non-standard Unicode encodings
  • pyqtlet : for GPS window
  • isal : for faster zlib compression/decompression

Benchmarks

http://asammdf.readthedocs.io/en/master/benchmarks.html

Comments
  • Fix Mat file Export

    Fix Mat file Export

    Python version

    Please run the following snippet and write the output here

    python=2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:19:30) [MSC v.1500 32 bit (Intel)]'
    'os=Windows-7-6.1.7601-SP1'
    

    Code

     for file_name in os.listdir(dir_mdf_file):
            mdf_parser = asammdf.mdf.MDF(name=file_name, memory='low', version='4.00')
            mdf_file = mdf_parser.export('mat',file_name)
    
    

    Traceback

    (<type 'exceptions.TypeError'>, TypeError("'generator' object has no attribute '__getitem__'",), <traceback object at 0x000000000E247A88>)
    

    Error 2: (<type 'exceptions.ValueError'>, ValueError('array-shape mismatch in array 7',), <traceback object at 0x0000000014D9B0C8>)

    Description

    While trying to convert MDF files to .mat files using MDF module, I am getting these two errors. I am assuming that Error 2 may be because of NUMPY, can anyone help why this error comes while exporting? Can i get help on this??

  • Converting large files

    Converting large files

    When converting large files to parquet or a Pandas Dataframe, I Always get a Memory error. I was wondering, if it is possible to have some kind of low Memory mode or even better Streaming mode.

    Essentially I want parquet files, but I saw that asammdf converts the .dat, mf4 etc... files to a Pandas DataFrame under the Hood anyway and uses the result to export to Parquet.

    So I was playing around with the Code trying to cast the columns to more appropriate dtypes.

    def _downcast(self, src_series):
        if np.issubdtype(src_series.dtype, np.unsignedinteger):
            res_series = pd.to_numeric(src_series, downcast='unsigned')
        elif np.issubdtype(src_series.dtype, np.signedinteger):
            if src_series.min() < 0:
                res_series = pd.to_numeric(src_series, downcast='signed')
            else:
                res_series = pd.to_numeric(src_series, downcast='unsigned')
        elif np.issubdtype(src_series.dtype, np.floating):
            res_series = pd.to_numeric(src_series, downcast='float')
        else:
            res_series = src_series.astype('category')
    
        return res_series
    

    It saves some memory, but unfortunately this is not enough. I do have some files that are 5Gb or larger. When converted to a DataFrame they get inflated to beyond 20Gbs.

    Any help is appreciated.

  • 'right_shift' not supported

    'right_shift' not supported

    Hello I met a issue when load MDF file, it seems comes from numpy, and this issue is not exist in version 2.5.3, bellowing is the error information

    site-packages\asammdf\mdf4.py", line 2912, in get vals = vals >> bit_offset

    ufunc 'right_shift' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

    at this time vals is a ndarray which with a list

  • Reading Channel Causes Crash

    Reading Channel Causes Crash

    Python version

    ('python=3.9.5 (tags/v3.9.5:0a7dcbd, May 3 2021, 17:27:52) [MSC v.1928 64 bit ' '(AMD64)]') 'os=Windows-10-10.0.19043-SP0' 'numpy=1.22.3' ldf is not supported xls is not supported xlsx is not supported yaml is not supported 'asammdf=7.0.7'

    Code

    MDF version

    4.10

    Code snippet

        data = MDF(mf4_file)
        sig = data.get('MIPI_CSI2_Frame.DataBytes')  # type: Signal Error occurs here
        real_sam = sig.samples  # type: ndarray
        offset = real_sam[0].size - 25
    

    OR

        it_data = data.iter_get(name='MIPI_CSI2_Frame.DataBytes', samples_only=True, raw=True)
        next(it_data) # error occurs here
    

    Traceback

    Traceback (most recent call last):
      File "C:\Users\xxxx\PycharmProjects\MF4Convert\venv\lib\site-packages\asammdf\blocks\mdf_v4.py", line 7442, in _get_scalar
        vals = extract(signal_data, 1, vals - vals[0])
    SystemError: <built-in function __import__> returned a result with an error set
    
    Process finished with exit code -1073741819 (0xC0000005) 
    

    Description

    File is very large ~3.5GB, trying to read data from the mentioned channel using either the iteration method or Signal methods causes an error. A similar file ~1.7GB in size reads fine. Both load into the asammdf tool just fine, including the file causing the crash, however the file causing the crash causes the same error I have above whenever i try to export data with the GUI.

    Reading a different channel in this file does not result in the error.

    The machine im using has 32GB of RAM and plenty of storage space.

  • In MDF files samples and timestamps length mismatch

    In MDF files samples and timestamps length mismatch

    I am using this tool for analyzing MDF files, I am getting this error

    asammdf.utils.MdfException: <SIGNAL_NAME> samples and timestamps length mismatch (58 vs 67)

    I have used ETAS tools to check the signal but there it seemed everything is fine, what is going wrong here?

  • multiple actions for file handling

    multiple actions for file handling

    Hello, too much actions are needed to handle files.

    Example : I've done acquisition on vehicule and want to do a post-processing with Matlab on a part of the file. currently, I have first to cut to keep a temporal parts and create a new file. then I've to filter in another file to keep only a short list of channels. and finally I've to export in a last .mat file. Same thing if we need to transmit datas to a supplier who works with other tools.

    It could be easier and faster to merge the 'filter','export', 'convert', 'cut' and 'resample' functions. It leads to directly choose in a single tab which channels we would like to handle and what kind of action has to be applied on it.

    1. choose channels idea is to have a channel selection list with 'clear', 'load' & 'save' function in order to select easily It could be great also to add beside a selected channel list as you do for 'search' function in order to have a easy look of what is selected. (in order to be fast, no specific selected channel could mean that the whole file as to be used)

    2. choose action(s) and output format and at rigth, we could find all temporal or sampling management options and all Output formats.

    By this way, handling files could be easy and fast.

    I tried to summarize in an example: image

    Your opinion ?

  • Bug in reading .dat file

    Bug in reading .dat file

    Python version: 3.6.1

    from asammdf import MDF
    
    def merge_mdfs(files):
        return MDF.merge(files).resample(0.1)
    
    def main():
        # Here I have code to read in a series of '.dat' files as a list into the variable 'files'
        merge_file = merge_mdfs(files)
    
        # The variable 'merge_file' contains channel names with the corrupt data
    

    Code

    MDF version

    4.7.8

    Code snippet

    return MDF.merge(files).resample(0.1)

    Traceback

    This code doesn't produce an error or a traceback

    Description

    Let me preface by saying that I am relatively new to python and even newer to this library, but I understand the importance of collaboration so I will try my best to help. Since I work for a big company, I can't share exactly everything I am working on, especially the data files I am using. However, I will do my best to supply all available information I can to resolve this issue.

    The issue I'm having is that when I read in a series of '.dat' files, sometimes the data gets read in perfectly, but other times the data gets all messed up and values that were not in the original data find their way in.

    Example: I am reading in acceleration data from an accelerometer. The min and max values of this data trace are confirmed by one of the other tools my company uses to plot data to be max: ~6.5, min: ~-1.5 (units = m/s^2). When I read a series of these same files in I get a max of the same value and a min of ~-13 m/s^2. When I go in and look at the data there are more data points than their should be, and the data doesn't flow like what I would expect to see (i.e. a lot of repeating values).

    Please let me know if anyone needs more information to help solve this issue. I will try my best to supply any additional information requested.

    Thanks for supporting this awesome library! :)

  • MDF4 get_group() breaks data

    MDF4 get_group() breaks data

    Python version

    ('python=3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 21:26:53) [MSC v.1916 32 bit '
     '(Intel)]')
    'os=Windows-10-10.0.18362-SP0'
    'numpy=1.16.1'
    'asammdf=5.10.4.dev0'
    

    Code

    MDF version

    4.00

    Code snippet

    from asammdf import MDF
    
    if __name__ == "__main__":
       mdf = MDF("path_to_file.MF4")
       df = mdf.get_group(5)
    

    Traceback

    Traceback (most recent call last):
    File "C:/myPath/main.py", line 5, in <module>
      df = mdf.get_group(5)
    File "myPath\venv\lib\site-packages\asammdf\mdf.py", line 3352, in get_group
      ignore_value2text_conversions=ignore_value2text_conversions,
    File "myPath\venv\lib\site-packages\asammdf\mdf.py", line 3423, in to_dataframe
      mdf = self.filter(channels)
    File "myPath\venv\lib\site-packages\asammdf\mdf.py", line 1699, in filter
      copy_master=False,
    File "myPath\venv\lib\site-packages\asammdf\blocks\mdf_v4.py", line 3954, in get
      _dtype = dtype(channel.dtype_fmt)
    ValueError: field '_level_1_structure._level_2_structure' occurs more than once
    

    so i added the following code to the following code to MDF4 -> _read_channels() -> while ch_addr https://github.com/danielhrisca/asammdf/blob/88e2e67a18a77c4ee437907a3f67603397b6eac0/asammdf/blocks/mdf_v4.py#L798

                if channel.component_addr:
                    channel.name += "_struct"
    

    I mentioned this in my email to you. This fixes the duplicate channel names. Now my Traceback is the following:

    C:\myPath\venv\lib\site-packages\pandas\core\indexes\numeric.py:443: RuntimeWarning: invalid value encountered in equal
      return ((left == right) | (self._isnan & other._isnan)).all()
    

    I was looking for the reason for this. It looks like you create a new filtered mdf file here, when using get_group() https://github.com/danielhrisca/asammdf/blob/88e2e67a18a77c4ee437907a3f67603397b6eac0/asammdf/mdf.py#L3423

    This new mdf has a fragmented data block. The first data_block fragment has a different total size and also a different samples_size than the following fragments. image

    When i check the returned pandas dataframe the data is correct for the first ~6500 rows, then garbage follows. If i use the get method to retrieve a single Signal from the original MDF object the data is okay.

    The file is rather large (160MB). Please tell me if you need it to find the cause.

  • Slow reading from External Hard Driver

    Slow reading from External Hard Driver

    I am working on a data analysis of multiple files stored in an external hard drive. Files are large (1-7GB). I was using mdfreader before and have recently migrated to asammdf, and I am finding a more similar behaviour when working with the local hard drive files, but a huge difference when loading from the external drive.

    For instance: just loading a 5GB file, and getting the samples for one signal.

    asammdf: 329.76s mdfreader (with no_data_loading = True): 6.42s

    However, running with the file in the local hard drive:

    asammdf: 14.22s mdfreader: 3.79s

    Is it there any way to improve this difference?

  • Loading Data is slow since asammdf 5.x.x

    Loading Data is slow since asammdf 5.x.x

    Hi Daniel,

    since I updated asammdf to 5.x.x (used 5.0.3, 5.0.4 and 5.1.0dev so far), loading data is dramatically slower than before!

    My general procedure for loading data into a pandas dataframe is:

    • loading the file
    • fetching (asammdf.get()) the samples, unit, comment and conversion of all channels using group and index information from channels_db
    • interpolation to the same raster (0.1s)
    • creating a pandas dataframe for the samples, units, comment

    For a mdf3 file with a size of 1,7Gb this needs 12 minutes to load! Doing the same with mdfreader only needs 45s.

    With asammdf 4.7.11 this only needs 26s. Obviously a huge difference.

    I think this is due to the removed memory option. As mentioned in asammdfs documentation, i can speed up data loading by using configure and tune the read_fragment_size parameter. Is there a way to have the same loading speed as with the old memory='full' option?

    Regards, legout

  • cannot fit 'int' into an index-sized integer

    cannot fit 'int' into an index-sized integer

    Python version

    'python=3.6.7 |Anaconda, Inc.| (default, Oct 23 2018, 19:16:44) \n[GCC 7.3.0]' 'os=Linux-4.20.12-arch1-1-ARCH-x86_64-with-arch' 'numpy=1.16.2' 'asammdf=5.0.2'

    Code

    MDF version

    4.10

    Code snippet

    Any list of valid channels will result in that error.

    with MDF(file) as mdf:
        mdf.filter(channels=["Ams_Mp"])
    

    Traceback

    ---------------------------------------------------------------------------
    OverflowError                             Traceback (most recent call last)
    <ipython-input-63-cb54d2207089> in <module>
          1 with MDF(file) as mdf:
    ----> 2     mdf.filter(channels=["Ams_Mp"])
    
    ~/.conda/envs/datatools/lib/python3.6/site-packages/asammdf/mdf.py in filter(self, channels, version)
       1587                 info=None
       1588                 comment="">
    -> 1589         <Signal SIG:
       1590                 samples=[ 12.  12.  12.  12.  12.]
       1591                 timestamps=[0 1 2 3 4]
    
    ~/.conda/envs/datatools/lib/python3.6/site-packages/asammdf/blocks/mdf_v4.py in _load_data(self, group, record_offset, record_count)
       1230 
       1231         Returns
    -> 1232         -------
       1233         data : bytes
       1234             aggregated raw data
    
    OverflowError: cannot fit 'int' into an index-sized integer
    

    Description

    Hello!

    I recently discovered an issue with the new version of asammdf (5.0.2) in version (4.7.9) it worked fine for me. As soon as I try to filter or select certain channels the aforementioned error will be raised.

  • how can I convert CSV file to MF4

    how can I convert CSV file to MF4

    Python version

    Please run the following snippet and write the output here

    import platform
    import sys
    from pprint import pprint
    
    pprint("python=" + sys.version)
    pprint("os=" + platform.platform())
    
    try:
        import numpy
        pprint("numpy=" + numpy.__version__)
    except ImportError:
        pass
    
    try:
        import asammdf
        pprint("asammdf=" + asammdf.__version__)
    except ImportError:
        pass
    

    Code

    MDF version

    _please write here the file version (you can run print(MDF(file).version))

    Code snippet

    please write here the code snippet that triggers the error

    Traceback

    please write here the error traceback

    Description

    The fastest way to debug is to have the original file. For data protection you can use the static method scramble to scramble all text blocks, and send the scrambled file by e-mail.

    Please describe the issue here.

  • File loading issue in asammdf Lib, when the python script is packaged using pyinstaller

    File loading issue in asammdf Lib, when the python script is packaged using pyinstaller

    Python version

    Please run the following snippet and write the output here

    import platform
    import sys
    from pprint import pprint
    
    pprint("python=" + sys.version)
    pprint("os=" + platform.platform())
    
    try:
        import numpy
        pprint("numpy=" + numpy.__version__)
    except ImportError:
        pass
    
    try:
        import asammdf
        pprint("asammdf=" + asammdf.__version__)
    except ImportError:
        pass
    

    Code

    ASAMMDF version : 5.20.6

    Error : To change to a dtype of different size, last axis must be contiguous version : 7.1.1 ,Error : "Multiple occurrences of channel".

    Code snippet

    data = MDF(mf4_file) for version 5.20.6 mdf_comman_py :(line 100) : Validate channel selection - version 7.1.1

    Traceback

    After converting to .exe ,it says the version doesnt support ,armxl and .dbc files for version 7.1.1 : Below : arxml is not supported csv is not supported dbc is not supported dbf is not supported json is not supported ldf is not supported kcd is not supported fibex is not supported sym is not supported xls is not supported xlsx is not supported yaml is not supported scapy is not supported wireshark is not supported odx is not supported

    Then throws below error : asammdf - ERROR - Error during CAN logging processing: Traceback (most recent call last): File "lib\site-packages\asammdf\blocks\mdf_v4.py", line 10480, in process_bus_logging File "lib\site-packages\asammdf\blocks\mdf_v4.py", line 10520, in process_can_logging File "lib\site-packages\asammdf\blocks\utils.py", line 1762, in load_can_database File "lib\site-packages\canmatrix\formats_init.py", line 52, in loads File "lib\site-packages\canmatrix\formats_init.py", line 86, in load KeyError: 'canmatrix.formats.dbc'

    Description

    I am unable to load few MF4 files in the asammdf version 5.20.6 ,as it gives the error "To change to a dtype of different size, last axis must be contiguous".Then, I changed asammdf lib version to 7.1.1 ,it gives error that "Multiple occurrences of channel". I changed the above exception to False, and it worked fine in the development mode, but when converted python script to .exe using pyinstaller ,the file doesnt load.

  • Feature: Save display file with multiple windows

    Feature: Save display file with multiple windows

    The ability to save a display configuration is very useful for quickly opening up previous analyses/views.

    However, it would be great if it would be possible to not only store 1 plot window - but that the display configuration stores the full 'grid' of plot windows with the correct sizing, focus area, plot coloring, zoom level (for GNSS plots) etc. This would enable almost a 'dashboard' style view in asammdf with minimal effort.

  • Logging camera data as MF4

    Logging camera data as MF4

    I am trying to save the webcam feed as MF4 file. So, I guess I'd have to save it frame by frame. I have a timestamp for every frame and also compression format (probably JPEG) and other metadata for every frame. What would be the best approach for this?

  • Asamdf file format

    Asamdf file format

    @danielhrisca I am trying to read mdf4 file having ethernet data using asammdf, where i only have one data group and around 50 channel group, and in each channel group i am having 6 channels. Moreover, i printed out the data from data group block for my specific channel name using .whereis().

    And how can i link the recorded data from a datablock to a respective channel group and a channel? if you could show in code where have you done that. Could you please explain that by calling the specefic channel name it prints out that specific channel sample drom the datablock of data group- how is it done or if could show in code where and how the linking is done. could you please explain the format of the data group i.e how the recorded data is saved? is it like first the mdf datgroup header then ethernet frame, then ip frame format and in it the data?, is this true?

    i really need your help.

    Thank you

  • No text can be seen after insert comment

    No text can be seen after insert comment

    Python version

    ('python=3.10.6 (tags/v3.10.6:9c7b4bd, Aug 1 2022, 21:53:49) [MSC v.1932 64 ' 'bit (AMD64)]') 'os=Windows-10-10.0.19042-SP0' 'numpy=1.23.3' 'asammdf=7.1.1'

    Description

    hello, I'm not sure if it's the reason I'm using the error, I don't see any text after I insert comments。 "Alt + I" I also operated

    comments

An universal file format tool kit. At present will handle the ico format problem.
An universal file format tool kit. At present will handle the ico format problem.

An universal file format tool kit. At present will handle the ico format problem.

Dec 26, 2021
Pti-file-format - Reverse engineering the Polyend Tracker instrument file format

pti-file-format Reverse engineering the Polyend Tracker instrument file format.

Aug 26, 2022
LightCSV - This CSV reader is implemented in just pure Python.

LightCSV Simple light CSV reader This CSV reader is implemented in just pure Python. It allows to specify a separator, a quote char and column titles

Mar 5, 2022
A Python library that provides basic functions to read / write Aseprite format files

A Python library that provides basic functions to read / write Aseprite format files

Jan 13, 2022
🧹 Create symlinks for .m2ts files and classify them into directories in yyyy-mm format.
🧹 Create symlinks for .m2ts files and classify them into directories in yyyy-mm format.

?? Create symlinks for .m2ts files and classify them into directories in yyyy-mm format.

Feb 7, 2022
Nintendo Game Boy music assembly files parser into musicxml format

GBMusicParser Nintendo Game Boy music assembly files parser into musicxml format This python code will get an file.asm from the disassembly of a Game

Dec 11, 2021
Python function to stream unzip all the files in a ZIP archive: without loading the entire ZIP file or any of its files into memory at once

Python function to stream unzip all the files in a ZIP archive: without loading the entire ZIP file or any of its files into memory at once

Nov 26, 2022
csv2ir is a script to convert ir .csv files to .ir files for the flipper.

csv2ir csv2ir is a script to convert ir .csv files to .ir files for the flipper. For a repo of .ir files, please see https://github.com/logickworkshop

Nov 18, 2022
Various technical documentation, in electronically parseable format

a-pile-of-documentation Various technical documentation, in electronically parseable format. You will need Python 3 to run the scripts and programs in

Nov 20, 2022
Search for files under the specified directory. Extract the file name and file path and import them as data.

Search for files under the specified directory. Extract the file name and file path and import them as data. Based on that, search for the file, select it and open it.

Jan 10, 2022
Python Fstab Generator is a small Python script to write and generate /etc/fstab files based on yaml file on Unix-like systems.

PyFstab Generator PyFstab Generator is a small Python script to write and generate /etc/fstab files based on yaml file on Unix-like systems. NOTE : Th

Nov 9, 2021
fast change directory with python and ruby

fcdir fast change directory with python and ruby run run python script , chose drirectoy and change your directory need you need python and ruby deskt

Jun 20, 2022
Uproot is a library for reading and writing ROOT files in pure Python and NumPy.
Uproot is a library for reading and writing ROOT files in pure Python and NumPy.

Uproot is a library for reading and writing ROOT files in pure Python and NumPy. Unlike the standard C++ ROOT implementation, Uproot is only an I/O li

Nov 30, 2022
pydicom - Read, modify and write DICOM files with python code

pydicom is a pure Python package for working with DICOM files. It lets you read, modify and write DICOM data in an easy "pythonic" way.

Dec 5, 2022
Python interface for reading and appending tar files

Python interface for reading and appending tar files, while keeping a fast index for finding and reading files in the archive. This interface has been

Nov 12, 2021
Here is some Python code that allows you to read in SVG files and approximate their paths using a Fourier series.
Here is some Python code that allows you to read in SVG files and approximate their paths using a Fourier series.

Here is some Python code that allows you to read in SVG files and approximate their paths using a Fourier series. The Fourier series can be animated and visualized, the function can be output as a two dimensional vector for Desmos and there is a method to output the coefficients as LaTeX code.

Jun 1, 2022
MHS2 Save file editing tools. Transfers save files between players, switch and pc version, encrypts and decrypts.

SaveTools MHS2 Save file editing tools. Transfers save files between players, switch and pc version, encrypts and decrypts. Credits Written by Asteris

Nov 17, 2022
Extract the windows major and minor build numbers from an ISO file, and automatically sort the iso files.
Extract the windows major and minor build numbers from an ISO file, and automatically sort the iso files.

WindowsBuildFromISO Extract the windows major and minor build numbers from an ISO file, and automatically sort the iso files. Features Parse multiple

Nov 9, 2022
A tool written in python to generate basic repo files from github
A tool written in python to generate basic repo files from github

A tool written in python to generate basic repo files from github

Dec 2, 2021