包含所有列名的CSV到Python字典?

时间:2011-04-17 18:09:30

标签: python sql csv dictionary import

我仍然很擅长使用p​​ython从头开始编程,所以作为练习我虽然拿了一个我使用SQL处理的文件尝试使用Python复制功能。看来我想把我的(压缩的,zip)csv文件创建一个它的Dict(或者也许是一个dicts的词典?)。当我使用dict reader时,我将第一行作为键而不是每列作为自己的键? E.g。

import csv, sys, zipfile
sys.argv[0] = "/home/tom/Documents/REdata/AllListing1RES.zip"
zip_file    = zipfile.ZipFile(sys.argv[0])
items_file  = zip_file.open('AllListing1RES.txt', 'rU')

for row in csv.DictReader(items_file,dialect='excel'):
    pass

收率:

>>> for key in row:
        print 'key=%s, value=%s' % (key, row[key])

key=MLS_ACCT    PARCEL_ID   AREA    COUNTY  STREET_NUM  STREET_NAME CITY        ZIP STATUS  PROP_TYPE   LIST_PRICE  LIST_DATE   DOM DATE_MODIFIED   BATHS_HALF  BATHS_FULL  BEDROOMS    ACREAGE YEAR_BUILT  YEAR_BUILT_DESC OWNER_NAME  SOLD_DATE   WITHDRAWN_DATE  STATUS_DATE SUBDIVISION PENDING_DATE    SOLD_PRICE,  
value=492859    28-15-3-009-001.0000    200 JEFF    3828    ORLEANS RD  MOUNTAIN BROOK  35243   A   SFR 324900  3/3/2011    2   3/4/2011 12:04:11 AM    0   2   3   0   1968    EXIST   SPARKS          3/3/2011 11:54:56 PM    KNOLLWOOD

所以我正在寻找的是MLS_ACCT的列和PARCEL_ID的单独列,以便我可以执行包含KNOLLWOOD的所有项目的平均价格等内容SUBDIVISION字段还有按日期范围划分的子部分,销售日期等。

我很清楚如何使用SQL,但正如我所说,我想在这里获得一些Python技能。 我最近几天一直在阅读,但还没有找到关于这种用例的任何非常简单的插图。指向所述文档的指针将不胜感激。我意识到我可以使用内存驻留的SQL-lite但我的愿望是再次学习Python方法。我已经阅读了一些关于Numpy和Scipy并加载了sage但仍然找不到一些有用的插图,因为这些工具似乎专注于只有数字作为元素的数组,我需要做很多字符串匹配以及日期范围计算和比较。

最终我需要替换表中的值(因为我有脏数据),我现在通过一个包含所有脏变体的“翻译表”并为最终用途提供“干净”答案来做到这一点。 / p>

3 个答案:

答案 0 :(得分:6)

您确定这是一个逗号分隔值的文件吗?看起来这些线条是由制表符分隔的。

如果这是正确的,请在DictReader构造函数中指定制表符分隔符。

for row in csv.DictReader(items_file, dialect='excel', delimiter='\t'):
    for key in row:
        print 'key=%s, value=%s' % (key, row[key])

来源:http://docs.python.org/library/csv.html

答案 1 :(得分:1)

用纯Python编写操作当然是可行的,但是你必须选择你的算法。您在上面发布的行输出看起来很像解析出错了;事实上,它似乎根本不是一个CSV,它是TSV吗?尝试将delimiter='\t'dialect=csv.excel_tab传递给DictReader。

读取完成后,DictReader应该可以将行作为字典,这是一种典型的面向行的结构。奇怪的是,这通常不是处理像你这样的查询的有效方式;只有列列表使搜索更容易。行方向意味着您必须为每一行重做一些查找工作。像日期匹配这样的东西需要CSV中肯定不存在的数据,比如日期的表示方式以及哪些列是日期。

获取面向列的数据结构的示例(但是,涉及加载整个文件):

import csv
allrows=list(csv.reader(open('test.csv')))
# Extract the first row as keys for a columns dictionary
columns=dict([(x[0],x[1:]) for x in zip(*allrows)])

不需要在变量中列出和存储的中间步骤。关键是使用zip(或其表兄itertools.izip)来转置表格。

然后从列two中的特定条件的所有行中提取列one

matchingrows=[rownum for (rownum,value) in enumerate(columns['one']) if value>2]
print map(columns['two'].__getitem__, matchingrows)

当您知道列的类型时,使用datetime.datetime.strptime等适当的函数解析它可能是有意义的。

答案 2 :(得分:0)

乍一看,您的输入可能实际上不是CSV,但可能是制表符分隔。查看python.org处的文档,您可以创建一个方言并使用它来更改分隔符。

import csv
csv.register_dialect('exceltab', delimiter='\t')
for row in csv.DictReader(items_file,dialect='exceltab'):
    pass