2011-04-17 54 views
4

我还是很新的使用python来从头开始编程,所以作为一个练习,虽然我会拿一个文件来处理使用SQL,尝试使用Python来复制功能。看来我想把我的(压缩的,zip)csv文件并创建一个Dict(或者可能是一个字典词典?)。当我使用dict阅读器时,我将第一行作为关键字,而不是每一列作为自己的关键字?例如。带有所有列名的CSV到Python字典?

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上阅读了一些内容,并且加载了圣人,但仍然无法找到一些有用的插图,因为这些工具似乎集中在只有数字作为元素的数组,我有很多字符串匹配,我需要做以及日期范围计算和比较。

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

+0

我们需要更多有关您正在构建的词典结构的更多信息以给出更确切的答案...让我们假设您将所有这些数据填入名为'mls'的词典中...您想如何订购关键字段?城市,细分,地址等等?此外,我怀疑,在你与循环词典键循环一段时间后,'sqllite'内存将更具吸引力... – 2011-04-17 18:30:26

+0

Dan提供了基本答案这些标签让我大吃一惊,你提到的更广泛的问题是现在是我的问题,正如我最初所说的,我拥有所有在SQL中工作的S **,但是我将它用作Python的学习案例。总之,我需要大部分基本组和总和/平均值(以及使用表上的替代数据创建视图,以提供清理“脏”数据等等,以便脱离SQL但尝试理解在Python中使用最好的结构和方法来获得类似的结果,数据集大约有500,000行 – dartdog 2011-04-17 19:03:11

回答

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

+0

嗯,我认为这可能是类似的东西...所以现在我有数据..现在谈到更广泛的问题是正确的方式去解决这个问题? – dartdog 2011-04-17 18:42:20

0

乍一看这似乎是你的输入可能不会实际上是CSV,但也许是标签,而不是分隔。查看python.org的文档,您可以创建一个Dialect并使用它来更改分隔符。

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

感谢您的快速反应!丹击败你,虽然! – dartdog 2011-04-17 18:56:02

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)转置表。

然后用某一标准中所有行one列提取柱two

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

当你知道一个列的类型,它可能是有意义的分析它,使用适当的功能,如datetime.datetime.strptime

+0

谢谢你的回应,,我有数据现在使用选项卡规格..数据是约500,000行,我想尝试做所有在内存中查询,你可以详细说明一下,或者指向我一些更多的资源,我想我应该至少将数据转换为适当的Python类型,特别是日期时间和美元到十进制..我'我真的不在寻找哟你写d **的东西!但仍然需要更多的指针! – dartdog 2011-04-17 18:55:03

+0

我真的不确定你在这里有什么指导。它看起来像你在用SQL思考;来自一种编程语言的非常普遍的效果,但是SQL甚至不是一种通用的编程语言。它是针对特定结构的数据库的查询语言,因此有了这样的问题,您只需使用Python构建RDBMS。我们确实有很多可以使用的函数,比如sum和decimal类型,但是Python的核心是一个连续的命令式语言 - 一个非常不同的野兽。列表理解,地图等是从函数式编程继承而来的。看看这些。 – 2011-04-18 19:47:48