尝试在Python中对.csv文件进行排序(创建列表并删除重复项)

时间:2019-04-08 07:50:04

标签: python python-3.x

我有一个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列中的值的列表,没有重复项。现在,输出中包含重复值。

3 个答案:

答案 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)))