python 从 csv 中读取数字时出错

python error in reading number from csv

我有一个 csv 文件,如 - order_id、姓名、地址
当我尝试通过 python 将数据从 csv 插入到 postgresql table 时,它没有正确读取数字。

例如让数据为

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 文件的 headers。

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

当我将您提供的示例更改为 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)

尝试在发送字典之前将浮点数格式化为字符串。

例子-

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 函数。