psycopg2:包含e +整数的copy_expert csv文件

时间:2016-11-16 21:48:37

标签: python pandas psycopg2

首先,让我展示如何重现问题。这是一个简单的设置。

这是我的简单测试csv文件

a;b
1;1
0;2
1.5637e+07;3

测试csv文件是由pandas dataframe的to_csv方法生成的

import csv, pandas as pd

d = {'a' : pd.Series([1, 0.0, 1.5637e+07]),'b' : pd.Series([1, 2, 3])}

df = pd.DataFrame(d)

df_csv = df.to_csv('test.csv', encoding="utf-8", index=False,
                   sep=';', quotechar='"', float_format="%g", quoting=csv.QUOTE_MINIMAL)    

然后,让我们在db

中创建一个测试表
create table testtb (
    a integer,
    b integer
)

最后,我尝试将csv文件导出到该表中,其中一些设置代码

def parse_column(header):
    column_str = ",".join(header[0].split(";"))
    return column_str

conn = psycopg2.connect("dbname=test1 " +
                            " user=postgres" +
                            " host=localhost" +
                            " password=password")

cur = conn.cursor()

with open('test.csv', "r") as f:
    reader = csv.reader(f)
    header = next(reader)
    f.seek(0)

    copy_sql = """
            COPY {}.{}({}) FROM STDIN CSV HEADER DELIMITER ';'
            """.format("public", "simplew", parse_column(header))
    cur.copy_expert(sql=copy_sql, file=f)

conn.commit()

问题是,现在我得到了

invalid input syntax for integer: "1.5637e+07"

此处解决方案的限制很少

  1. 我不能使用数据帧的to_sql方法,我在这里做批量复制,to_sql太慢..
  2. 因为No.1,我必须按照上面列出的程序,to_csv,然后将csv复制到DB,这意味着我不能使用任何代码来格式化" 1.5637e + 07& #34;,除了在to_csv方法中设置float_format ..
  3. 关于float_format,我需要摆脱浮点数的尾随零,所以我把它设置为%g当前
  4. 最后,我以这种方式得到输入数据框:

    df = DataFrame.from_records(list(  my_api_call()   ))
    

    我上面的例子只是为了展示案例

1 个答案:

答案 0 :(得分:1)

1.5637e+07不是整数。这是一个浮动

>>> 1.5637e+07
15637000.0
>>> type(1.5637e+07)
<class 'float'>

如果您想要一个整数,只需15637*10**315637000。那将是一个整数。

pd.Series([1, 0.0, 15637000])

注意:执行int(1.5637e+07)也可以在这里工作,但是会因为最高10次幂的精度损失而失败:(int(1.5637e+22) = 15637000000000000786432)所以更好地坚持整数取幂,不像C整数,python整数可以处理无限的价值,最多只有内存限制)