报错不是 `sqlite3` 的问题,而是 **pandas 读取 txt 时用错了编码**

Bol5261 CSDN会员 Bol5261 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

这个报错不是 `sqlite3` 的问题,而是 **pandas 读取 txt 时用错了编码**。

你的代码里大概率写了:

```python
encoding="utf-8"
```

但你的 txt 文件很可能是 **GBK / GB2312 / ANSI / GB18030** 编码,所以报:

```text
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd4
```

---

## 直接改法:把 encoding 改成 gb18030

建议优先用 `gb18030`,它兼容 GBK、GB2312,适合中文 Windows 文本文件。

把你的读取代码从:

```python
pd.read_csv(
    txt_path,
    sep=",",
    encoding="utf-8",
    chunksize=100_000
)
```

改成:

```python
pd.read_csv(
    txt_path,
    sep=",",
    encoding="gb18030",
    chunksize=100_000
)
```

完整示例:

```python
import pandas as pd
import sqlite3

txt_path = r"D:\Project_2026\你的流水.txt"
db_path = r"D:\Project_2026\流水.db"

conn = sqlite3.connect(db_path)

for chunk in pd.read_csv(
    txt_path,
    sep=",",              # 如果不是逗号分隔,这里要改
    encoding="gb18030",   # 重点:不要用 utf-8
    chunksize=100_000,
    dtype=str             # 先全部按字符串读,避免账号、卡号被转成科学计数法
):
    chunk.to_sql(
        "transactions",
        conn,
        if_exists="append",
        index=False
    )

conn.close()

print("导入完成")
```

---

## 如果你的 txt 是制表符分隔

很多银行流水 txt 不是逗号分隔,而是制表符分隔。

如果文件内容看起来像这样:

```text
交易日期    账号    金额    摘要
2024-01-01    6222xxx    100.00    转账
```

那要改成:

```python
sep="\t"
```

完整代码:

```python
import pandas as pd
import sqlite3

txt_path = r"D:\Project_2026\你的流水.txt"
db_path = r"D:\Project_2026\流水.db"

conn = sqlite3.connect(db_path)

for chunk in pd.read_csv(
    txt_path,
    sep="\t",
    encoding="gb18030",
    chunksize=100_000,
    dtype=str
):
    chunk.to_sql(
        "transactions",
        conn,
        if_exists="append",
        index=False
    )

conn.close()

print("导入完成")
```

---

## 如果不知道分隔符,可以先预览前几行

新建一个小脚本,看一下文件前 5 行:

```python
txt_path = r"D:\Project_2026\你的流水.txt"

with open(txt_path, "r", encoding="gb18030", errors="replace") as f:
    for i in range(5):
        print(f.readline())
```

运行后观察:

### 如果字段之间是逗号

```text
交易日期,账号,金额,摘要
```

用:

```python
sep=","
```

### 如果字段之间是很多空白或 Tab

```text
交易日期    账号    金额    摘要
```

可以试:

```python
sep="\t"
```

或者:

```python
sep=r"\s+"
```

如果用正则空白分隔,需要加:

```python
engine="python"
```

例如:

```python
pd.read_csv(
    txt_path,
    sep=r"\s+",
    engine="python",
    encoding="gb18030",
    chunksize=100_000,
    dtype=str
)
```

---

## 更稳妥版本:自动尝试多种编码

你可以先用这个版本,它会依次尝试常见编码:

```python
import pandas as pd
import sqlite3

txt_path = r"D:\Project_2026\你的流水.txt"
db_path = r"D:\Project_2026\流水.db"

encodings = ["utf-8-sig", "gb18030", "gbk", "gb2312", "ansi"]

success = False

for enc in encodings:
    try:
        print(f"正在尝试编码:{enc}")

        conn = sqlite3.connect(db_path)

        for chunk in pd.read_csv(
            txt_path,
            sep=",",          # 如果不是逗号分隔,这里要改
            encoding=enc,
            chunksize=100_000,
            dtype=str
        ):
            chunk.to_sql(
                "transactions",
                conn,
                if_exists="append",
                index=False
            )

        conn.close()
        print(f"导入完成,使用编码:{enc}")
        success = True
        break

    except UnicodeDecodeError as e:
        print(f"编码 {enc} 失败:{e}")
        try:
            conn.close()
        except:
            pass

if not success:
    print("所有编码都失败,请检查文件编码或文件是否损坏")
```

不过注意:如果某个编码读到一半才失败,可能已经往数据库写入了一部分数据。更推荐先用下面这个小脚本测试编码。

---

## 推荐先测试编码

先运行这个:

```python
txt_path = r"D:\Project_2026\你的流水.txt"

encodings = ["utf-8-sig", "utf-8", "gb18030", "gbk", "gb2312"]

for enc in encodings:
    try:
        with open(txt_path, "r", encoding=enc) as f:
            for _ in range(5):
                print(f.readline().strip())
        print(f"\n成功编码:{enc}")
        break
    except UnicodeDecodeError:
        print(f"失败编码:{enc}")
```

一般你这个情况,大概率会显示:

```text
成功编码:gb18030
```

---

## 你现在最应该改的地方

你当前报错的核心是:

```text
UnicodeDecodeError: 'utf-8'
```

所以先把你的代码第 9 行附近的:

```python
encoding="utf-8"
```

改成:

```python
encoding="gb18030"
```

也就是:

```python
for chunk in pd.read_csv(
    txt_path,
    sep=",",
    encoding="gb18030",
    chunksize=100_000,
    dtype=str
):
```

---

## 另外提醒:账号、卡号一定要用字符串读

流水文件里通常有账号、卡号、身份证号、流水号,这些不能让 pandas 自动转数字,否则可能变成科学计数法,或者丢失前导 0。

建议一直加:

```python
dtype=str
```

例如:

```python
for chunk in pd.read_csv(
    txt_path,
    sep=",",
    encoding="gb18030",
    chunksize=100_000,
    dtype=str
):
    ...
```

---

如果你愿意,把你 txt 前 2 行内容贴出来,注意可以把账号、姓名、卡号打码,我可以帮你判断应该用 `sep=","`、`sep="\t"`,还是其他分隔符。

...全文

相关推荐

tsc_data:使用python pandas读取并转换为数据框,然后进行存储,然后将数据框转换为SQliteDB。 输出在HTML上呈现

tsc_data 使用python pandas读取并转换为数据框,然后进行存储,然后将数据框转换为SQliteDB。 输出在HTML上呈现

谁家扁舟子

读写文件读取文件操作读取文件操作读取文件操作读取文件操作

读取文件操作读取文件操作读取文件操作读取文件操作读取文件操作读取文件操作读取文件操作读取文件操作读取文件操作读取文件操作读取文件操作

yado_eado123

python 数据分析–数据处理工具Pandas(1)

数据处理工具Pandas1. 序列和数据框的构造1.1 构造序列1.2 构造数据框2. Pandas从外部读取数据2.1 文本文件的读取2.2 电子表格的读取2.3 数据库的读取3. 数据描述统计 说明: 本文用到的数据集下载地址: 链接:https://pan.baidu.com/s/1zSOypUVoYlGcs-z2pT2t0w 提取码:z95a Pands模块可以帮助数据分析师轻松地解决数据的预处理问题,如数据类型的转换、缺失值的处理、描述性统计分析、数据的汇总等。Pandas模块的核心操作对象就是序列(Series)和数据框(DataFrame)。序列可以理解为数据集中的一个字段,数

weixin_38546024

103976个英语单词库txt版本

103976个英语单词库txt版本 分隔符是制表符 方便大家用python判断单词,也方便大家转为自己想要的数据库

jos

接口自动化 python pytest+requests+allure+pandas+sqlite3+loguru 数据驱动

数据驱动,测试用例数据使用sqlite(大数据量)+Excel(小数据量)管理,多线程执行测试脚本,8小时(10线程下)执行22万+测试用例数据。

0xhy89
评论
收藏 已收藏
分享
返回顶部
Bol5261 CSDN会员
Bol5261 新星创作者: Java技术领域 新星创作者: Java技术领域优质创作者: 学术研究与理论基础技术领域 优质创作者: 学术研究与理论基础技术领域
Borter 9 成员 1,323 内容