Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否将行ID映射到外部csv文件?_Python_Sql_Postgresql_Csv_Openerp - Fatal编程技术网

Python 是否将行ID映射到外部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表中存在这样的城市名称,那么所有内容都将顺利导入 但当不止一个城市同名时,问题就会出现。然后,为了解决名

我有一个带有地址信息的csv文件:
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()