【问题标题】:Exact match in Python CSV row and columnPython CSV 行和列中的完全匹配
【发布时间】:2014-08-25 05:39:44
【问题描述】:

我环顾了一会儿,没有找到任何与我正在做的事情相匹配的东西。

我有这个代码:

import csv
import datetime

legdistrict = []
reader = csv.DictReader(open('active.txt', 'rb'), delimiter='\t')

for row in reader:
    if '27' in row['LegislativeDistrict']:
        legdistrict.append(row)

ages = []

for i,value in enumerate(legdistrict):
    dates = datetime.datetime.now() - datetime.datetime.strptime(value['Birthdate'], '%m/%d/%Y')
    ages.append(int(datetime.timedelta.total_seconds(dates) / 31556952))

total_values = len(ages)
total = sum(ages) / total_values

print total_values
print sum(ages)
print total

搜索一个制表符分隔的文本文件并在名为LegislativeDistrict 的列中查找包含字符串27 的行。 (因此,查找第 27 个 LD 中的所有行。)它运行良好,但如果字符串是单个数字,我会遇到问题。

当我使用27 运行代码时,我得到以下结果:

0 ;) eric@crunchbang ~/sbdmn/May 2014 $ python data.py
74741
3613841
48

这意味着有 74,741 个值包含 27,总年龄为 3,613,841,平均年龄为 48。

但是当我使用4 运行代码时,我得到了这个结果:

0 ;) eric@crunchbang ~/sbdmn/May 2014 $ python data.py
1177818
58234407
49

第一个结果 (1,177,818) much 太大了。我所在的州没有超过 170,000 的 LD,而且我的名单只涉及选民。

因此,我假设使用 4 会找到 所有 包含 4 的值...所以 144124将全部使用,从而导致数量巨大。

有没有一种方法可以搜索特定列中的值并使用正则表达式或精确搜索?正则表达式有效,但我不能让它只搜索一列 - 它搜索整个文本文件。

我的数据如下所示:

StateVoterID    CountyVoterID   Title   FName   MName   LName   NameSuffix  Birthdate   Gender  RegStNum    RegStFrac   RegStName   RegStType   RegUnitType RegStPreDirection   RegStPostDirection  RegUnitNum  RegCity RegState    RegZipCode  CountyCode  PrecinctCode    PrecinctPart    LegislativeDistrict CongressionalDistrict   Mail1   Mail2   Mail3   Mail4   MailCity    MailZip MailState   MailCountry Registrationdate    AbsenteeType    LastVoted   StatusCode
IDNUMBER    OTHERIDNUMBER       NAME        MI      01/01/1900  M   123     FIRST   ST      W           CITY    STATE   ZIP MM  123 4   AGE 5                                   01/01/1950  N   01/01/2000  B

【问题讨论】:

  • '4' in 400(例如)将返回True,因为in 会进行子字符串检查-您不使用== 来检查字符串是否相等的任何特殊原因?
  • 喜欢if row === 4? @JonClements
  • if row['LegislativeDistrict'] == '4'... '4' in '400'True'4' == '400'False
  • 您可能还希望注意那里的整数除法...您可能希望确保某些值是显式浮点数。在您的解释器中尝试3/2float(3)/2 的结果(或只是3.0/2 - 看起来您刚刚在那里获得了ints,所以您将失去精度
  • 我要去睡觉了...见math.ceil :)

标签: python regex list search


【解决方案1】:

'4' in '400' 将返回 True,就像 substring check 一样。改用'4' == '400',它只会在两个字符串相同时返回True

if '4' == row['LegislativeDistrict']:
    (...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    相关资源
    最近更新 更多