报错不是 `sqlite3` 的问题,而是 **pandas 读取 txt 时用错了编码**
这个报错不是 `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上呈现
读写文件读取文件操作读取文件操作读取文件操作读取文件操作
读取文件操作读取文件操作读取文件操作读取文件操作读取文件操作读取文件操作读取文件操作读取文件操作读取文件操作读取文件操作读取文件操作
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)。序列可以理解为数据集中的一个字段,数
103976个英语单词库txt版本
103976个英语单词库txt版本 分隔符是制表符 方便大家用python判断单词,也方便大家转为自己想要的数据库
接口自动化 python pytest+requests+allure+pandas+sqlite3+loguru 数据驱动
数据驱动,测试用例数据使用sqlite(大数据量)+Excel(小数据量)管理,多线程执行测试脚本,8小时(10线程下)执行22万+测试用例数据。


