【问题标题】:pandas.read_csv : OperationalError: table has no column named 1pandas.read_csv:OperationalError:表没有名为 1 的列
【发布时间】:2016-12-16 21:20:51
【问题描述】:

我正在尝试使用以下方法将 csv 上传到 Windows 上的 sqllite 表:

sqllite表和csv的字段名相同,以:

开头
CREATE TABLE test2 (
id INTEGER NOT NULL, 
"case" TEXT, 
 ......
PRIMARY KEY (id), 
UNIQUE ("case")
)

我有以下课程:

class Sqllite_utilities(object):

    def __init__(self, db_path, table_name):
        self.db_path = db_path
        self.table_name = table_name

    def upload_csv_to_table(self, path_to_csvfile):
        conn = sqlite3.connect(self.db_path)
        df = pandas.read_csv(path_to_csvfile)
        df.to_sql(self.table_name, conn, if_exists='append', index_label='id')

在命令行:

s = Sqllite_utilities(settings.SETTINGS_PATH+"\\data.db",'test2')

In[3]: s.upload_csv_to_table('C:\Users\ne\Desktop\jtest.csv')
C:\lib\site-packages\pandas\core\generic.py:1201: UserWarning: The spaces in these column names will not be changed. In pandas versions < 0.14, spaces were converted to underscores.
  chunksize=chunksize, dtype=dtype)
Traceback (most recent call last):
  File "C:\lib\site-packages\IPython\core\interactiveshell.py", line 2885, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-3-b530f5199977>", line 1, in <module>
    s.upload_csv_to_table('C:\Users\dnir\Desktop\jtest.csv')
  File "F:\ENVS\r2\j1\utilities.py", line 41, in upload_csv_to_table
    df.to_sql(self.table_name, conn, if_exists='append', index_label='id')
  File "C:\lib\site-packages\pandas\core\generic.py", line 1201, in to_sql
    chunksize=chunksize, dtype=dtype)
  File "C:\lib\site-packages\pandas\io\sql.py", line 470, in to_sql
    chunksize=chunksize, dtype=dtype)
  File "C:\lib\site-packages\pandas\io\sql.py", line 1503, in to_sql
    table.insert(chunksize)
  File "C:\lib\site-packages\pandas\io\sql.py", line 664, in insert
    self._execute_insert(conn, keys, chunk_iter)
  File "C:\lib\site-packages\pandas\io\sql.py", line 1291, in _execute_insert
    conn.executemany(self.insert_statement(), data_list)
OperationalError: table test2 has no column named 1

我做错了什么?

编辑:我想你明白了,我遇到了一个新错误,我会单独调查:

  df.to_sql(self.table_name, conn, if_exists='append', index_label='id')
File "C:\lib\site-packages\pandas\core\generic.py", line 1201, in to_sql
  chunksize=chunksize, dtype=dtype)
File "C:\lib\site-packages\pandas\io\sql.py", line 470, in to_sql
  chunksize=chunksize, dtype=dtype)
File "C:\lib\site-packages\pandas\io\sql.py", line 1503, in to_sql
  table.insert(chunksize)
File "C:\lib\site-packages\pandas\io\sql.py", line 642, in insert
  keys, data_list = self.insert_data()
File "C:\lib\site-packages\pandas\io\sql.py", line 609, in insert_data
  "duplicate name in index/columns: {0}".format(err))
 ValueError: duplicate name in index/columns: cannot insert id, already exists

【问题讨论】:

  • 表是否已经存在,但没有该列名?
  • 是的,该表存在并且没有名为“1”的列
  • 那么你的 pandas 数据框列需要匹配 db 列名
  • 你让我想到了,我打开了 csv 并添加了一个屏幕截图。可能发生的情况是熊猫将第一行作为列标题,而不是数据
  • 是的,你没有标题,所以试试df = pandas.read_csv(path_to_csvfile, names =['col1name', 'col2name']) 之类的匹配数据库列

标签: python sqlite csv pandas


【解决方案1】:

问题出在索引列上,Pandas 将数据框的索引作为“索引”列。如果你不想在没有它的情况下插入记录,试试这个;

df.to_sql(..., index=False)

【讨论】:

    猜你喜欢
    • 2015-06-07
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多