Python 是否将行ID映射到外部csv文件?
我有一个带有地址信息的csv文件:Python 是否将行ID映射到外部csv文件?,python,sql,postgresql,csv,openerp,Python,Sql,Postgresql,Csv,Openerp,我有一个带有地址信息的csv文件:zip,城市,州,国家,街道,门牌号(最后一个是门牌号)。这是通过OpenERP导入接口导入的。因此,您可以通过提供以下三种方法之一导入相关数据—名称、数据库id或外部id。最简单的方法是提供名称 例如,对于城市,我不需要特别提供它的id(并将列从street更改为street\u id,然后再更改为该街道id),只需提供它的真实名称,如某个城市。如果city表中存在这样的城市名称,那么所有内容都将顺利导入 但当不止一个城市同名时,问题就会出现。然后,为了解决名
zip
,城市
,州
,国家
,街道
,门牌号
(最后一个是门牌号)。这是通过OpenERP导入接口导入的。因此,您可以通过提供以下三种方法之一导入相关数据—名称
、数据库id
或外部id
。最简单的方法是提供名称
例如,对于城市,我不需要特别提供它的id(并将列从street
更改为street\u id
,然后再更改为该街道id),只需提供它的真实名称,如某个城市
。如果city
表中存在这样的城市名称,那么所有内容都将顺利导入
但当不止一个城市同名时,问题就会出现。然后,为了解决名称冲突,我需要专门提供这些城市ID。但问题是,有如此多的地址,几乎不可能只是查看并手动将名称更改为ID
所以我想知道是否有可能编写一些脚本或将csv文件作为条件传递给postgresql(或使用ORM的OpenERP),以便它返回符合csv文件条件的ID列表
在我的数据库中,已经导入了街道
表中所有需要的街道和城市
表中的城市
city
表具有以下结构(带有示例数据):
状态
表格示例:
id| name|
1 | State1
2 | State2
所以,正如您所看到的,如果您要转到state
表,可以通过它们的id或state\u id或state name来区分相同的名称
还有一个添加csv文件的示例(在数据库中还有一个表可以导入该信息)
如果我通过OpenERP接口验证这样的csv文件,我会得到警告,有两个城市同名。如果我继续,它会选择首先导入数据库的城市,然后一些地址会用错误的状态为它们分配城市(请记住,列city也用于不同的村庄等,所以不同的州有相同的名称)
因此,我需要将城市名称更改为城市ID,但正如我所说的,有数十万行,手动操作几乎是不可能的,而且需要花费大量时间
最后,我需要的是以某种方式将地址csv文件中的所有信息传递到数据库中,特别是传递到city
表中,并返回ID列表
例如,如果我要输入(作为city
table的条件):
它应该向我输出以下内容:
1
2
3
1
有人能告诉我如何得到这样的结果吗?我通过编写以下脚本解决了这个问题:
# -*- encoding: utf-8 -*-
#!/usr/bin/python
import psycopg2
import csv
#Connect to database
conn = psycopg2.connect(database="db_name",
user="user", password="password", host="127.0.0.1", port="5432")
cur = conn.cursor()
#Get all cities ids and names with specific state
cur.execute("SELECT id, name from res_country_state_city WHERE state_id = 53")
rows = cur.fetchall()
rows_dict = {}
#Generate dict from data provided
for row in rows:
rows_dict[row[1]] = row[0]
#Check which name from cities-names.csv match with name in database
#(match returns that cities id
with open('cities-names.csv') as csvfile:
with open('cities-ids.csv', 'wb') as csvfile2:
reader = csv.reader(csvfile)
writer = csv.writer(csvfile2)
#create ids csv file and write ids that were matched
for row in reader:
if rows_dict.get(row[0]):
writer.writerow([rows_dict.get(row[0])])
conn.close()
你的问题很难理解!你到底想做什么?更正数据库中的所有条目?或者改进CSV导入例程以备将来添加?你说的是“CSV文件中的匹配条件”然而,CSV文件并不表示条件。在最后的示例中,您的数字列表从1,2,2,1到1,2,3,1,没有明显的原因。对于这个问题的这种表述,我感到抱歉。想不出如何更容易地表达它。我想要的是获取我想要与CSV地址相关的城市的ID(在地址表中导入时).现在我得到了名称,但正如我所写的,可以有相同的名称,所以需要ID。对于ID,这是两个不同的表ID。首先
1,2,2,1
是state
表行ID,其次(1,2,3,1
您可以在city
表示例中看到这些城市与这些ID匹配)是city
表行id…继续。因此我输入city
名称和state\u id
,并返回city
id,它通过这两个条件匹配。
name | state_id|
City1| 1
City1| 2
City2| 2
City1| 1
1
2
3
1
# -*- encoding: utf-8 -*-
#!/usr/bin/python
import psycopg2
import csv
#Connect to database
conn = psycopg2.connect(database="db_name",
user="user", password="password", host="127.0.0.1", port="5432")
cur = conn.cursor()
#Get all cities ids and names with specific state
cur.execute("SELECT id, name from res_country_state_city WHERE state_id = 53")
rows = cur.fetchall()
rows_dict = {}
#Generate dict from data provided
for row in rows:
rows_dict[row[1]] = row[0]
#Check which name from cities-names.csv match with name in database
#(match returns that cities id
with open('cities-names.csv') as csvfile:
with open('cities-ids.csv', 'wb') as csvfile2:
reader = csv.reader(csvfile)
writer = csv.writer(csvfile2)
#create ids csv file and write ids that were matched
for row in reader:
if rows_dict.get(row[0]):
writer.writerow([rows_dict.get(row[0])])
conn.close()