Python(初学者):CSV列写入,时间自相关函数的意外输出

时间:2012-05-31 10:09:57

标签: python csv

尝试将第四列写入一组看起来像这样的数据

 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()    

2 个答案:

答案 0 :(得分:1)

我不确定是不是这样,但也许你在最后一个循环中使用了错误的循环变量。

fields = line.split()

line在整个循环期间不会改变,因此您最终会使用与字典相同的密钥。

答案 1 :(得分:1)

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

fields = line.split()

并将下一行更改为

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

您的代码还有一些问题:

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

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

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

  4. 您确定计数的算法非常效率低下。您正在遍历列表中每个条目的整个列表。你可以一次完成。

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

    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")