1

尝试将第四列写入一组数据,如下所示

 8000.5   16745     0.1257
 8001.0   16745     0.1242
 8001.5   16745     0.1565
 8002.0   16745     0.1595

其中有第二个数字(即 16745)在该特定文件中被计算的次数(它确实发生了变化,列表有几千个条目)。即如果这是整个文件

 8000.5   16745     0.1257   4
 8001.0   16745     0.1242   4
 8001.5   16745     0.1565   4
 8002.0   16745     0.1595   4

我的代码的问题似乎在编写阶段,字典可以工作,如果我打印它,csv.reader 正在读取文件,但是当涉及到附加它拾取的唯一字典键时(字段 [1])似乎为 16745 为 -1 的位置,并且该计数打印在所有行的第四列中。我不明白为什么它只针对这个值而不是每行与字典交叉引用。

即我得到

 8000.5   16745     0.1257   [count of -1 in column 2]
 8001.0   16745     0.1242   [count of -1 in column 2]
 8001.5   16745     0.1565   [count of -1 in column 2]
 8002.0   16745     0.1595   [count of -1 in column 2]

任何帮助将不胜感激!

import numpy
import string
import csv
import sys
import os

time = []
water = []
itemcount ={}

global filename
filename = sys.argv[1]

f1 = open(sys.argv[1], 'rt')
for line in f1:
    fields = line.split()
    time.append(fields[0])
    water.append(fields[1])
f1.close()

for x in water:
    a = water.count(x)
    itemcount[x] = a

writerfp = open('watout.csv', 'w')
writer = csv.writer(writerfp)
for row in csv.reader(open(filename, 'r')):
    fields = line.split()
    row.append(itemcount[fields[1]])
    writer.writerow(row)
writerfp.close()    
4

2 回答 2

1

我不确定情况是否如此,但也许您在最后一个循环中使用了错误的循环变量。

fields = line.split()

line在整个循环过程中不会改变,因此您最终会使用与字典相同的键。

于 2012-05-31T10:23:57.817 回答
1

您的错误的原因是在最后一个循环中。你应该下线

fields = line.split()

并将下一行更改为

row.append(itemcount[row[1]])

您的代码还有一些问题:

  1. filename您在全局范围内声明为全局。这是没有意义的,因为无论如何它都是全球性的。而且,代码中的下一行sys.argv[1]再次使用。

  2. 您应该使用with语句来打开文件。

  3. t在 Python 2.x 中打开文件时没有模式。

  4. 您确定计数的算法效率非常低。您正在为列表的每个条目迭代整个列表。您可以一次性完成。

清理所有这些问题并删除所有未使用的变量,您可以使用以下代码完成工作:

import collections
with open(sys.argv[1], "r") as input:
    counts = collections.Counter(line.split()[1] for line in input)
    input.seek(0)
    with open("watout.csv", "w") as output:
        for line in input:
            count = counts[line.split()[1]]
            output.write(line.rstrip("\n") + "\t" + str(count) + "\n")
于 2012-05-31T10:52:13.637 回答