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