我有一个9列的.csv文件。我需要获得第五列的列表,而无需使用熊猫就不能重复。列中的值是产品ID,例如“ H0073456”。文件中有超过一百万行。快到凌晨4点了,我很难过。救命!
似乎我需要生成列中值的列表格式,但我不知道如何。每次尝试时,我只会成功获取第一个值,或者将第一个值的每个字符分开。
import csv
with open('myfile.csv', 'r') as f_the_file:
reader = csv.reader(f_the_file)
for row in reader:
print(row[4])
这给了我整列,但仍然包括重复项。我如何过滤掉它们?
预期结果是.csv文件第5列中的值的列表,没有重复项。现在,输出中包含重复值。
答案 0 :(得分:2)
您应该查看适合您的完美对象:set()
集合删除重复项,让我们检查O(1)中的值是否在集合中。
因此您的代码应类似于:
import csv
without_duplicates = set()
with open('myfile.csv', 'r') as f_the_file:
reader = csv.reader(f_the_file)
for row in reader:
without_duplicates.add(row[4])
答案 1 :(得分:0)
初始化一个空集合,然后向该集合中添加元素。这样,您仅需继续向集合中添加唯一元素。阅读完文件后,可以根据需要将其转换为列表。
import csv
productID = set()
with open('myfile.csv', 'r') as f_the_file:
reader = csv.reader(f_the_file)
for row in reader:
productID.add(row[4])
productID_list = list(productID)
答案 2 :(得分:0)
您可以为此使用set
理解:
import csv
with open('myfile.csv') as f:
product_ids = {row[4] for row in csv.reader(f)}
如果您绝对需要列表,请稍后再致电product_ids = list(product_ids)
。
如果您需要保留原始顺序(将值保留在第一次出现的位置),则应使用itertools
recipe unique_everseen
(可能需要很多内存):
from itertools import filterfalse def unique_everseen(iterable, key=None): "List unique elements, preserving order. Remember all elements ever seen." # unique_everseen('AAAABBBCCDAABBB') --> A B C D # unique_everseen('ABBCcAD', str.lower) --> A B C D seen = set() seen_add = seen.add if key is None: for element in filterfalse(seen.__contains__, iterable): seen_add(element) yield element else: for element in iterable: k = key(element) if k not in seen: seen_add(k) yield element
import csv
with open('myfile.csv') as f:
product_ids = list(unique_everseen(row[4] for row in csv.reader(f)))