我是Python脚本的初学者。
我有一个包含5列和1000多行的CSV文件。我附上一个截图,以了解文件的样子。 (我只包含4行,但实际文件有超过1000行)。所以我想要实现的任务是:
我需要打印输出csv文件,该文件根据以下条件打印原始csv文件的行。
CSV文件中的数据采用以下格式。
Number Name Choices
11234 ABCDEF A1B6N5
11234 ABCDEF A2B6C4
11234 EFGHJK A4F2
11235 ABCDEF A3F5H7
11236 MNOPQR F3D4D5
所以我的预期输出应该是这样的。标志和消息只应在"编号"时显示。有一个以上的名字"与之相关联。 如果"名称"已被关联到多个"数字"它不应该被标记。 (如11235与11234同名,但未标记)。
Number Name Choices Flag Message
11234 1 More than 1 name
11234
11234
11235 ABCDEF A3F5H7
11236 MNOPQR F3D4D5
我知道这可以作为哈希表实现,其中数字用作键,名称用作值。如果任何键的值计数大于1,我们可以设置一个标志并相应地打印错误消息。
但有人可以帮助我开始这个吗?如何,我如何在Python中实现它?
感谢任何帮助。
谢谢!
答案 0 :(得分:0)
以下是您应该首先了解和理解的一些概念:
导入和导出CSV:https://docs.python.org/2/library/csv.html
计数器:https://docs.python.org/2/library/collections.html#collections.Counter
或
Defaultdict(int)用于计数:https://docs.python.org/2/library/collections.html#collections.defaultdict
听起来你需要column1才能成为字典的关键。如果您要计算它出现的次数(不清楚),那么您可以使用names = defaultdict(int); names[key]+=1
如果您想要的是删除没有计数的重复项,或者如果有重复项就会崩溃,那么您可以执行以下操作:
mydict = {}
with open('yourfile.csv', mode='r') as infile:
reader = csv.reader(infile)
with open('yourfile.csv', mode='w') as outfile:
writer = csv.writer(outfile)
for row in reader:
key = row[0]
if key in mydict:
#Could handle this separately
print "Bad key, already found: %s. Ignoring row: %s" % (key, row)
raise #Element already found
mydict[key] = row
writer.writerows(mydict.values())
如果这不起作用,请给我们样本输入和预期输出。无论哪种方式,这应该让你开始。另外,请耐心等待:你会通过做错事来了解最多,并找出错误的原因。祝你好运!
====
更新: 你有几个选择。开头最简单的可能就是构建两个列表然后输出它们。
使用key = row[1]
如果密钥已在字典中,请将其删除(del mydict[key]
)并将其添加到其他字典multiple_dict = {}; multiple_dict[key] = [number, None, None, Data, Message]
def proc_entry(row):
key = row[1]
Saved existing data
if key in mydict:
multiple_dict[key] = key, None, None, 1, "Message"
del mydict[key]
elif key in multiple_dict:
#Key was already duplicated, increase flag?
multiple_dict[key][4]+=1
此时,您的代码变得非常复杂,可以使用以下内容:
number, name, value = row
,并将您的代码拆分为函数。然后,您应该使用已知输入测试函数,以查看输出是否符合预期。
即预加载“mydict”,然后调用您的处理函数,看看它是如何工作的。更好的?学习编写简单的单元测试:)。
虽然我们可以为您编写,但这不是Stackoverflow的精神。如果您还有其他问题,可能需要将其拆分为尚未回答的精确问题。我在上面提到的所有内容都可以在Stackoverflow上找到并进行一些练习。知道什么样的解决方案就是编程的艺术!玩得开心......或者如果这对你不好玩,请雇佣程序员!