从csv读取数字时出现python错误

时间:2015-06-30 08:41:18

标签: python postgresql csv psycopg2

我有一个csv文件,如 - order_id,name,address
当我尝试通过python将数据从csv插入postgresql表时,它不能正确读取数字。

例如,让数据

order_id  |  name  |  address
----------+--------+----------
5432548543| Manish | Dummy Address

它读取order_id,如5.43E + 9而不是整数。我的代码就像:

filename.encode('utf-8')
with open(filename) as file:
    data = csv.DictReader(file)
    cur.executemany("""Insert into temp_unicom values(%(Order Id)s,%(Name)s,%(Address)s)""", data)

此处订单ID,名称,地址是我的csv文件的标题。

如何正确格式化数据? 编辑::
链接到csv文件CSV File

2 个答案:

答案 0 :(得分:1)

当我更改您提供给csv的示例时:

order_id,name,address
5432548543,Manish,Dummy Address

只需遍历行,将它们打印出来:

with open('./data.txt') as f:
    data = csv.DictReader(f)
    for row in data:
            print(l)

我明白了:

{'order_id': '5432548543', 'name': 'Manish', 'address': 'Dummy Address'}

这表明问题不在csv解析步骤中 - 但您应该在数据集上尝试相同的事情来进行双重检查。

然后问题是 - 你的postgres驱动程序做了什么可能导致问题?你在用psycopg2吗?它是否在某处进行自动投射?

编辑所以问题是src数据。有时你有科学记数法。您需要先清理数据,然后再将其传递给executemany

data = csv.DictReader(f)

clean_data = []
for d in data:
    clean_data.append(d)
    try:
        d['Order Id'] = str(int(float(d['Order Id'])))
    except ValueError:
        pass

cur.executemany("""Insert into temp_unicom values (%(Order Id)s, %(Name)s, %(Address)s)""", clean_data)

答案 1 :(得分:0)

尝试在发送词典之前将float格式化为字符串。

示例 -

cur.executemany("""Insert into temp_unicom values(%(Order Id)f,%(Name)s,%(Address)s)""",dict((k,v )if k != "Order Id" else (k,'%f'%(v)) for k,v in dict1.iteritems()))

此外,将字典重命名为其他内容(我例如重命名为dict1,否则它将替换内置的dict函数。