csv导入sqlite3而不指定列类型

时间:2014-02-25 04:44:29

标签: python csv sqlite

我有一个包含大约280列的csv文件,这些列可能会不时更改。有没有办法将csv文件导入sqlite3并让它“猜测”列类型? 我正在使用python脚本导入它。

2 个答案:

答案 0 :(得分:2)

如果您能够在此项目中使用第三方库,我建议pandas

使用pandas可以分两步完成:

  1. Read CSV file into pandas DataFrame
  2. Write pandas DataFrame to SQLite
  3. 例如:

    import pandas, pandas.io.sql, sqlite3
    
    # some sample csv data copied from: http://wesmckinney.com/blog/?p=635
    csvfilepath = '/path/to/file.csv'
    
    # `index_col` set to False ensures pandas doesn't use 1st col of data as index
    df = pandas.io.parsers.read_csv(csvfilepath,index_col=False) 
    
    # connect to in-memory database for testing; replace `:memory:` w/ file path
    con = sqlite3.connect(':memory:')
    pandas.io.sql.write_frame(df, 'test_tbl', con)
    con.execute('select * from test_tbl').fetchone()
    con.close()
    

    查询结果:

    (u'C00410118',
     u'P20002978',
     u'Bachmann, Michele',
     u'HARVEY, WILLIAM',
     u'MOBILE',
     u'AL',
     366010290,
     u'RETIRED',
     u'RETIRED',
     250,
     u'20-JUN-11',
     None,
     None,
     None,
     u'SA17A',
     736166,
     u'A1FDABC23D2D545A1B83',
     u'P2012')
    

    通过内省查询,您可以看到pandas完成了创建表的工作,甚至推断了数据类型:

    con.execute("select * from sqlite_master where type='table';").fetchone()[4]
    

    给出:

    CREATE TABLE test_tbl (
      [cmte_id] TEXT,
      [cand_id] TEXT,
      [cand_nm] TEXT,
      [contbr_nm] TEXT,
      [contbr_city] TEXT,
      [contbr_st] TEXT,
      [contbr_zip] INTEGER,
      [contbr_employer] TEXT,
      [contbr_occupation] TEXT,
      [contb_receipt_amt] INTEGER,
      [contb_receipt_dt] TEXT,
      [receipt_desc] REAL,
      [memo_cd] REAL,
      [memo_text] REAL,
      [form_tp] TEXT,
      [file_num] INTEGER,
      [tran_id] TEXT,
      [election_tp] TEXT )
    

答案 1 :(得分:0)

将csv中列的标题设置为sqlite3表中的相同列名。然后在插入DB之前使用type()直接读取并检查类型。