首先,让我展示如何重现问题。这是一个简单的设置。
这是我的简单测试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"
此处解决方案的限制很少
最后,我以这种方式得到输入数据框:
df = DataFrame.from_records(list( my_api_call() ))
我上面的例子只是为了展示案例
答案 0 :(得分:1)
1.5637e+07
不是整数。这是一个浮动
>>> 1.5637e+07
15637000.0
>>> type(1.5637e+07)
<class 'float'>
如果您想要一个整数,只需15637*10**3
或15637000
。那将是一个整数。
pd.Series([1, 0.0, 15637000])
注意:执行int(1.5637e+07)
也可以在这里工作,但是会因为最高10次幂的精度损失而失败:(int(1.5637e+22) = 15637000000000000786432
)所以更好地坚持整数取幂,不像C整数,python整数可以处理无限的价值,最多只有内存限制)