尝试将第四列写入一组看起来像这样的数据
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()
答案 0 :(得分:1)
我不确定是不是这样,但也许你在最后一个循环中使用了错误的循环变量。
fields = line.split()
line
在整个循环期间不会改变,因此您最终会使用与字典相同的密钥。
答案 1 :(得分:1)
您的错误原因是在最后一个循环中。你应该删除
行fields = line.split()
并将下一行更改为
row.append(itemcount[row[1]])
您的代码还有一些问题:
您在全球范围内声明filename
为全球。这是毫无意义的,因为它无论如何都是全球性的。此外,代码中的下一行再次使用sys.argv[1]
。
您应该使用with
语句打开文件。
在Python 2.x中打开文件时没有t
模式。
您确定计数的算法非常效率低下。您正在遍历列表中每个条目的整个列表。你可以一次完成。
清理所有这些问题并删除所有未使用的变量,您可以使用以下代码完成工作:
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")