编辑csv字典中的键值以执行以下操作

AEA*_*AEA -1 python csv dictionary key python-2.7

我为这个问题的不良标题道歉,但是很难用代码来解释.我想让我的代码执行以下操作; 如果等级键是2并且数字键是任何(空白,数字或其他),并且如果前一行是等级键1和数字键1则继续到脚本的下一行.

然而,尽管做了很多努力,我似乎​​无法让代码产生应有的效果.需要注意的代码行是第14行,但我认为最好提供一些背景代码来设置上下文.

示例数据

Unique Name,Rank,100% OmNTS,Numeric
xyz,1,10.2,1
xyz,2,12.5,-
xyz,3,18.8,2
xyz,4,25.9,
pmz,1,29.8,1
pmz,2,200.9,5
pmz,3,210.9,
pmz,4,250.89,
pmz,5,290.9685,
xyz2,1,10.9,1
xyz2,2,12.59,3
xyz2,3,18.8,2
xyz2,4,25.9,,
pmz2,1,29.8,,
pmz2,2,200.9,5
pmz2,3,210.9,
pmz2,4,250.89,
pmz2,5,290.9685,
Run Code Online (Sandbox Code Playgroud)

代码段:

for counter, row in enumerate(reader):
counter += 1
if counter != 1:
    for field in fields[3:]:
        if field == "Numeric" or field == "Rank":
            row[field] = row[field] and float(row[field])
        if field == "Rank":
            row[field] = row[field] and int(row[field])

    key = (row['Rank'], row['Numeric'])
    previous = entries[row['Unique Name']]


    if (key[0] == 2) and (1 <= key[1] <= 50 or key[1] is None) and ((1, 1) in previous):
        p = previous[(1, 1)]
        print 'test data text {r[Rank]} test {p[Rank]} test {r[100% OmNTS]} test {p[100% OmNTS]} '.format(r=row, p=p)
Run Code Online (Sandbox Code Playgroud)

我们希望在第2行中匹配,其中第3行中的元素(包括计数中的标题行),其中第2行的元素将被存储为先前的.第7行和第12行也是如此,但是这个Key引用会忽略第16行,因为第15行不是(1,1)

期望的输出

test data text 2 test 1 test 12.5 test 10.2
test data text 2 test 1 test 200.9 test 29.8
test data text 2 test 1 test 12.59 test 10.9
Run Code Online (Sandbox Code Playgroud)

非常感谢您花时间看我的问题.AEA

小智 5

您的编码可能出错的一些区域:

  • 如果你有一些代码应该打印正确的输出,但没有,可能是csv阅读器或文件对象迭代器已经用尽.你可能在交互式shell中工作,你应该在每次运行循环之前打开文件并初始化reader对象.
  • 空字段由空字符串表示,而不是由None.
  • 从您的代码段,目前还不清楚reader,fields并且entries有,也许里面还有一些bug,以及.

我自己尝试使用csv模块:

from csv import DictReader

with open('example.csv') as f:
    check = False
    for row in DictReader(f):
        n = row['Numeric'].replace('-', '')
        r = row['Rank']

        if check and r == '2' and (not n or 1 <= float(n) <= 50):
            s = row['100% OmNTS'], omnts_p
            print 'test data text 2 test 1 test %s test %s' % s

        elif r == n == '1':
            check = True
            omnts_p = row['100% OmNTS']

        else:
            check = False
Run Code Online (Sandbox Code Playgroud)

我希望这是你想要的.它会打印所需的输出:

test data text 2 test 1 test 12.5 test 10.2
test data text 2 test 1 test 200.9 test 29.8
test data text 2 test 1 test 12.59 test 10.9
Run Code Online (Sandbox Code Playgroud)