【问题标题】:Getting the Unicode Decode Error of 'cp950' codec can't decode byte 0x80 in position 2516: illegal multibyte sequence获取“cp950”编解码器的 Unicode 解码错误无法解码位置 2516 中的字节 0x80:非法多字节序列
【发布时间】:2019-11-27 19:04:05
【问题描述】:

我想读取 CSV 文件调用 testing.csv 并使用 Python 将其导入 SQLite 数据库。

但是,得到错误 enter image description here

这是 Python 代码:

import csv, sqlite3

con= sqlite3.connect('my_dataset.db')
cur = con.cursor()
cur.execute("CREATE TABLE t(aa,bb,cc,dd);")

with open('testing.csv','r') as fin:
    dr = csv.DictReader(fin)
    to_db = [(i['aa'], i['bb'],i['cc'],i['dd']) for i in dr]

cur.executemany("INSERT INTO t(aa,bb,cc,dd) VALUES (?,?,?,?);", to_db)
con.commit()
con.close()

这是 CSV 文件: enter image description here

此外,我还想获得每行的平均值、最大值和最小值。我应该使用 SQL 关键字(AVG、MAX、MIN)还是其他方式?任何想法?我应该放在哪里?

谢谢~

【问题讨论】:

  • 您尚未为 csv 文件指定编码。默认值可能不适用于该特定文件,您需要找出创建它时使用的编码。

标签: python sqlite csv


【解决方案1】:

将您的 csv 解码为 utf-8

为此,请更改:

with open('testing.csv','r') as fin:

with open('testing.csv','r', encoding='utf-8') as fin:

【讨论】:

  • 出现不同的错误:UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 2516: invalid start byte
  • 我检查了我的 CSV 文件的编码,即 <_io.textiowrapper name="testing.csv" mode="r" encoding="cp950">
  • @AlexYip 您可能在该 csv 中有非 ascii 字符,这会阻止您解码,只需执行errors='ignore',这样就可以完成open('testing.csv','r', encoding='utf-8',errors='ignore')。这意味着只有你的 csv 的 ascii 字符,我猜你想添加到你的表中,将被包括在内。
  • @AlexYip 对于第二部分,是的,您可以使用 sql AVG MAX MIN。如果您想使用其他东西,您可以使用 sql 获取该行,然后使用 python 计算如下值:sql="SELECT * FROM t;" row=cur.execute(sql).fetchone() average, maximum, minimum = (sum(row) / len(row), max(row), min(row))。至于你应该使用什么,好吧,两者都试一下,看看什么最适合你。我真的不知道你的用例,也许甚至不需要 sql,你可以只使用 pandas 来代替。话虽如此,如果此答案对您有所帮助,请确保将其标记为正确以供将来的人们查看。
猜你喜欢
  • 2015-02-23
  • 1970-01-01
  • 1970-01-01
  • 2019-05-25
  • 2017-09-27
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多