VeighNa量化社区
你的开源社区量化交易平台 | vn.py | vnpy
Member
avatar
加入于:
帖子: 1
声望: 0

Traceback (most recent call last):
File "C:\veighna_studio\Lib\site-packages\vnpy_datamanager\ui\widget.py", line 215, in import_data
start, end, count = self.engine.import_data_from_csv(
~~~~~~~~^
file_path,
^^^^^^^^^^
...<12 lines>...
datetime_format
^^^^^^^^^^^^^^^
)
^
File "C:\veighna_studio\Lib\site-packages\vnpy_datamanager\engine.py", line 48, in import_data_from_csv
buf: list = [line.replace("\0", "") for line in f]
^
UnicodeDecodeError: 'gbk' codec can't decode byte 0xa1 in position 4357: illegal multibyte sequence

Super Moderator
avatar
加入于:
帖子: 120
声望: 13

我来帮你分析这个编码错误问题。首先让我查询相关文档和源代码。

问题分析

根据错误信息和源代码分析,问题出在 vnpy_datamanager/engine.py 文件的第 48 行:

with open(file_path) as f:
    buf: list = [line.replace("\0", "") for line in f]

根本原因open() 函数没有指定编码参数,在 Windows 系统上默认使用 gbk 编码读取文件。但你的 CSV 文件实际使用的是 UTF-8 编码(或其他编码),导致解码失败。


解决方案

方案一:修改 VeighNa 源码(推荐)

修改 C:\veighna_studio\Lib\site-packages\vnpy_datamanager\engine.py 文件第 48 行,显式指定编码为 utf-8

# 修改前
with open(file_path) as f:

# 修改后
with open(file_path, encoding="utf-8") as f:

如果 CSV 文件是带 BOM 的 UTF-8 格式(Excel 保存的 UTF-8 通常带 BOM),则使用:

with open(file_path, encoding="utf-8-sig") as f:

方案二:转换 CSV 文件编码

使用文本编辑器(如 Notepad++、VS Code)将 CSV 文件另存为 GBK/GB2312 编码格式,再导入。

Notepad++ 操作步骤

  1. 打开 CSV 文件
  2. 点击菜单【编码】→【转为 ANSI 编码】
  3. 保存文件

VS Code 操作步骤

  1. 打开 CSV 文件
  2. 点击右下角显示编码的位置(如 "UTF-8")
  3. 选择【通过编码保存】→【GB2312】

方案三:使用 Python 脚本转换编码

# 将 UTF-8 编码的 CSV 转换为 GBK 编码
with open("input.csv", "r", encoding="utf-8") as f:
    content = f.read()

with open("output.csv", "w", encoding="gbk") as f:
    f.write(content)

建议

推荐方案一,因为:

  1. 一次性解决问题,后续导入 UTF-8 编码的 CSV 文件无需再转换
  2. UTF-8 是目前最通用的编码格式
  3. 修改简单,只需添加 encoding="utf-8" 参数

修改后记得重启 VeighNa Trader 使改动生效。

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】