使用python将.dbc文件转换为.csv

时间:2019-02-13 01:27:00

标签: python

我正在编写一个Python脚本,将.DBC文件转换为.CSV

我搜索了很多库来帮助我,但都没有成功。有人知道在此转换任务中可能有用的选项/软件包吗?

5 个答案:

答案 0 :(得分:1)

我不知道进行实际转换的任何内容,但是假设您是说DBC BUS格式,那么有一个Python库可以读取:https://pypi.org/project/cantools/

Python具有内置的用于编写CSV的工具:https://docs.python.org/3/library/csv.html

只需几行就可以将这些库组合成一个转换器。

答案 1 :(得分:1)

将其转换为XLS(Microsoft Excel),从那里可以将其转换为.csv,我是ubuntu家伙,但我认为应该有导出选项。或至少在LibreOffice中有

答案 2 :(得分:0)

我真的不明白为什么有些成员对问题给出-1,但并没有真正回答。

好吧,我还没有找到将.DBC转换为.CSV的好库。 但是我可以使用Python + R做到这一点,我在这里分享我的实现方式。

下面的Python脚本获取R路径并执行dbc2csv.R文件,并发送三个arg:原始文件路径,转换后的文件路径以及将要转换的文件名。

import subprocess
import commands


def dbc2csv(raw_filename):
dbc2csv_path = "/path/to/script/dbc2csv.R " + raw_files_dir + " " + converted_files_dir + " " + raw_filename

try:
    r_script_path = commands.getstatusoutput('which Rscript')[1]
    subprocess.call(r_script_path + " --vanilla " + dbc2csv_path, shell=True)
    return True
except:
    print("(Rscript) Error converting file: " + raw_filename)

return False

下面的R脚本dbc2csv.R实际上是谁将转换。

#install.packages("read.dbc") You need this package
library("read.dbc")


dbc2dbf <- function(rawDir, convertedDir, file) {
    # reads dbc file
    x <- read.dbc(paste(rawDir, file, sep=""))
    # write it to csv
    write.csv(x, file=paste(convertedDir, file, ".csv", sep=""))
}

args = commandArgs(trailingOnly=TRUE)
try(dbc2dbf(args[1], args[2], args[3]), TRUE)

我们知道,仅使用Python进行转换会更好。 但是这种方法会很好用。

答案 3 :(得分:0)

如果您在Linux上使用python,则替代方法之一是使用位于此存储库中的项目:https://github.com/greatjapa/dbc2csv

通过创建一个运行bash脚本和python脚本的docker来工作(您也可以在不使用docker的情况下单独运行它们,并且效果也一样)。

还值得注意的是,Datasus使用的.dbc扩展名是他们自己创建的扩展名(与cantools和其他此类工具使用的.dbc不相关),这只会使它难以使用。

答案 4 :(得分:0)

在python中,有一个很棒的库https://pypi.org/project/cantools/

您可以浏览其源代码以找到需要提取的字段:https://github.com/eerimoq/cantools/tree/f120d35e1523201b6d87e87306457bf1769330e3

在此github链接的cantools / database / can / message.py和/database/can/signal.py中可以找到有关消息和信号的所有相关字段

例如:如果需要名称和信号单位,则可以使用signal.name和signal.unit

示例代码以提取以下字段:

 #**dbc_file** is the full path of dbc 
    db = cantools.database.load_file(dbc_file)
    for msg in db.messages:
        msg_name = msg.name
        msg_id = msg.frame_id
        msg_length = msg.length
        sender = msg.senders
        msg_group = db.get_message_by_name(msg_name)
    
        for signal in msg_group.signals:
            
            #name of signal
            sig_name = signal.name
            #unit of signal
            sig_unit = signal.unit

希望这可能对某人有帮助!

相关问题