我有一个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
答案 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
函数。