我仍然很擅长使用python从头开始编程,所以作为练习我虽然拿了一个我使用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>
答案 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])
答案 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