本文目录导读:

- 基础文本记录脚本(Python - 手动输入)
- 自动采集OBD数据(Python + OBD-II适配器)
- 车载GPS轨迹记录(Bash + gpsd)
- 自动生成日报/周报(Shell + awk)
- Web界面管理(轻量级Flask + SQLite)
- 选择建议
- 额外考虑
记录车辆使用记录可以通过多种脚本实现,具体取决于你使用的平台(如Linux、Windows、车载系统等)以及数据采集方式(手动输入、传感器、OBD接口等),以下是几种常见场景及对应的脚本示例:
基础文本记录脚本(Python - 手动输入)
适合个人或小团队手动记录每次用车信息。
#!/usr/bin/env python3
import csv
import os
from datetime import datetime
FILE_NAME = "vehicle_usage.csv"
def log_usage():
# 检查文件是否存在,不存在则创建并写入表头
if not os.path.exists(FILE_NAME):
with open(FILE_NAME, mode='w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(["日期", "时间", "出发地", "目的地", "起始里程(km)", "结束里程(km)", "行驶里程(km)", "驾驶员", "备注"])
# 获取用户输入
date = input("日期 (YYYY-MM-DD, 默认今天): ") or datetime.now().strftime("%Y-%m-%d")
time = input("时间 (HH:MM, 默认现在): ") or datetime.now().strftime("%H:%M")
start = input("出发地: ")
end = input("目的地: ")
start_mile = input("起始里程 (km): ")
end_mile = input("结束里程 (km): ")
driver = input("驾驶员: ")
note = input("备注 (可选): ")
# 计算行驶里程
try:
distance = float(end_mile) - float(start_mile)
except ValueError:
distance = 0.0
# 写入CSV
with open(FILE_NAME, mode='a', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow([date, time, start, end, start_mile, end_mile, f"{distance:.1f}", driver, note])
print(f"记录已保存至 {FILE_NAME},本次行驶 {distance:.1f} 公里。")
if __name__ == "__main__":
while True:
log_usage()
again = input("是否继续记录?(y/n): ").strip().lower()
if again != 'y':
break
运行方式:保存为 log_vehicle.py,在终端执行 python3 log_vehicle.py。
自动采集OBD数据(Python + OBD-II适配器)
使用ELM327或类似OBD适配器连接车辆OBD接口,自动读取里程、时间、油耗等数据(需安装python-obd库)。
#!/usr/bin/env python3
import obd
import csv
import time
from datetime import datetime
FILE_NAME = "obd_vehicle_log.csv"
def connect_obd():
# 尝试连接OBD适配器(默认波特率38400或115200)
connection = obd.OBD() # 或者指定端口: obd.OBD("/dev/ttyUSB0")
return connection
def log_obd_data(conn):
if not conn.is_connected():
print("OBD连接失败")
return
# 确保文件存在并写入表头
with open(FILE_NAME, mode='a', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
if f.tell() == 0: # 文件为空则写表头
writer.writerow(["时间", "车速(km/h)", "发动机转速(RPM)", "里程(km)", "剩余油量(%)"])
# 循环读取数据
try:
while True:
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
speed = conn.query(obd.commands.SPEED).value # 返回km/h
rpm = conn.query(obd.commands.RPM).value
# 如果支持里程读取(部分车辆)
# mileage = conn.query(obd.commands.FUEL_LEVEL).value # 请根据实际命令调整
fuel = conn.query(obd.commands.FUEL_LEVEL).value # 百分比
# 写入CSV
with open(FILE_NAME, mode='a', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow([now, speed, rpm, "", fuel])
print(f"记录: {now} 速度={speed} km/h")
time.sleep(2) # 每隔2秒采集一次
except KeyboardInterrupt:
print("停止采集")
if __name__ == "__main__":
conn = connect_obd()
if conn.is_connected():
log_obd_data(conn)
else:
print("无法连接OBD设备,请检查适配器与车辆连接。")
前置依赖:pip install python-obd,并需购买ELM327蓝牙/WiFi适配器。
车载GPS轨迹记录(Bash + gpsd)
基于GPS设备实时记录车辆位置、速度、时间。
#!/bin/bash
# 需要安装 gpsd 和 gpspipe
LOG_FILE="gps_track_$(date +%Y%m%d).log"
if ! command -v gpspipe &> /dev/null; then
echo "请先安装 gpsd 和 gpspipe"
exit 1
fi
# 启动gpsd(如果未运行)
sudo gpsd /dev/ttyAMA0 # 替换为你的GPS设备端口
# 监听GPS数据并写入日志
gpspipe -w -n 100000 | while read line
do
# 解析JSON数据,提取时间和经纬度(需安装 jq 以便解析)
if command -v jq &> /dev/null; then
time=$(echo "$line" | jq -r '.time // empty')
lat=$(echo "$line" | jq -r '.lat // empty')
lon=$(echo "$line" | jq -r '.lon // empty')
speed=$(echo "$line" | jq -r '.speed // empty')
if [ -n "$time" ] && [ -n "$lat" ] && [ -n "$lon" ]; then
echo "$time $lat $lon $speed" >> "$LOG_FILE"
fi
else
# 不解析JSON,直接保存原始数据
echo "$line" >> "$LOG_FILE"
fi
done
说明:适用于树莓派、GPS模块等场景,生成带时间戳的位置日志。
自动生成日报/周报(Shell + awk)
基于记录的CSV文件,汇总统计每日里程。
#!/bin/bash
# 统计 vehicle_usage.csv 中每日累计里程
REPORT_FILE="daily_report_$(date +%Y%m%d).txt"
echo "========== 车辆使用日报表 ==========" > "$REPORT_FILE"
echo "日期 | 行驶里程(km) | 驾驶员" >> "$REPORT_FILE"
echo "--------------------------------" >> "$REPORT_FILE"
awk -F',' 'NR>1 {print $1, $7, $8}' vehicle_usage.csv | awk '{
sum[$1] += $2
if (!($1 in drivers)) drivers[$1]=$3
}
END {
for (date in sum) {
printf "%s | %.1f | %s\n", date, sum[date], drivers[date]
}
}' >> "$REPORT_FILE"
echo "报表已生成: $REPORT_FILE"
Web界面管理(轻量级Flask + SQLite)
提供一个网页端手动/自动记录,适合多人使用。
from flask import Flask, request, render_template, redirect
import sqlite3
from datetime import datetime
app = Flask(__name__)
DB_FILE = "vehicle.db"
def init_db():
conn = sqlite3.connect(DB_FILE)
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS usage_records (
id INTEGER PRIMARY KEY AUTOINCREMENT,
date TEXT,
time TEXT,
start_loc TEXT,
end_loc TEXT,
start_mile REAL,
end_mile REAL,
distance REAL,
driver TEXT
)''')
conn.commit()
conn.close()
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
date = request.form.get('date') or datetime.now().strftime("%Y-%m-%d")
time = request.form.get('time') or datetime.now().strftime("%H:%M")
start = request.form['start']
end = request.form['end']
start_mile = float(request.form['start_mile'])
end_mile = float(request.form['end_mile'])
driver = request.form['driver']
distance = end_mile - start_mile
conn = sqlite3.connect(DB_FILE)
c = conn.cursor()
c.execute("INSERT INTO usage_records VALUES (?,?,?,?,?,?,?,?)",
(None, date, time, start, end, start_mile, end_mile, distance, driver))
conn.commit()
conn.close()
return redirect('/')
conn = sqlite3.connect(DB_FILE)
c = conn.cursor()
c.execute("SELECT * FROM usage_records ORDER BY id DESC LIMIT 50")
records = c.fetchall()
conn.close()
return render_template('index.html', records=records)
if __name__ == '__main__':
init_db()
app.run(host='0.0.0.0', port=5000, debug=False)
配套HTML(templates/index.html):略,可自行编写带表单和表格的页面。
选择建议
| 场景 | 推荐脚本 |
|---|---|
| 手动记录,简单快速 | Python文本记录(方案1) |
| 自动采集车辆发动机、速度数据 | OBD脚本(方案2) |
| 实时追踪车辆位置 | GPS脚本(方案3) |
| 生成统计报表 | Shell + awk(方案4) |
| 团队管理、Web可视化 | Flask + SQLite(方案5) |
额外考虑
- 数据存储:CSV适合小规模,SQLite适合多用户查询,InfluxDB适合高频时序数据。
- 合规性:记录车辆使用涉及隐私(如驾驶员、位置),需确保符合当地数据保护法规。
- 硬件成本:OBD适配器约30-100元,GPS模块约50-200元。
根据你的实际需求(是否有OBD/GPS硬件、是否需要网络界面、记录频率等)选择合适的方案即可。