使用特定于列的重复筛选器将行追加到Python中的CSV

使用特定于列的重复筛选器将行追加到Python中的CSV,python,list,csv,append,Python,List,Csv,Append,因此,我希望Python使用csv读写器,将目录中的所有csv合并,同时过滤掉第二列中包含任何其他行值副本的任何行 以下是我的非工作脚本: import csv import glob with open('merged.csv','a') as out: seen = set() output = [] out_writer = csv.writer(out) csv_files = [f for f in glob.glob('*.csv') if 'mer

因此,我希望Python使用csv读写器,将目录中的所有csv合并,同时过滤掉第二列中包含任何其他行值副本的任何行

以下是我的非工作脚本:

import csv
import glob

with open('merged.csv','a') as out:
    seen = set()
    output = []
    out_writer = csv.writer(out)
    csv_files = [f for f in glob.glob('*.csv') if 'merged' not in f]
#csv_files = glob.glob('*.csv') 
     # I'd like to use all files including the output so that I don't
     # have to rename it when reusing the script - it should dupe-filter itself!
for filename in csv_files:
    with open(filename, 'rb') as ifile:
        read = csv.reader(ifile, delimiter=',')
        for row in read:
            if row[1] not in seen:
                seen.add(row[1])
                if row: #was getting extra rows
                    output.append(row)
out_writer.writerows(output)
我觉得我一定错过了一些简单的事情。我的每个文件大小约为100MB,我最终希望实现自动化,以便不同的计算机可以共享一个合并的文件进行重复检查


对于额外的积分,我如何更改此项以检查同时具有
行[1]
行[2]
的行?(当然,一旦dupe过滤器和自包含功能发挥作用后……

我建议使用pandas而不是csv writer。我会将您的代码重写为以下内容:

import pandas as pd
import glob

data = pd.concat([pd.DataFrame.from_csv(file) for
                  file in glob.glob("*.csv")]).drop_duplicates(cols=COLNAME_LIST)
data.to_csv('merged.csv')

在全面披露中,我没有测试这段代码,因为我没有大量的csv文件,但我以前也成功地写过类似的东西

这比熊猫可能需要的少量行要多,因为它是股票Python,但另一方面,它相对简单,将过滤多个列值,并处理重新读取以前的结果。它使用
fileinput
模块,允许它将多个输入文件视为一个连续的数据行流

import csv
import fileinput
import glob
import os

merged_csv = 'merged.csv'
columns = (1, 2)  # columns used for filtering
pathname = '*.csv'
tmpext = os.extsep + "tmp"
csv_files = glob.glob(pathname)

if merged_csv not in csv_files:
    prev_merged = None
else:
    prev_merged = merged_csv + tmpext
    os.rename(merged_csv, prev_merged)
    csv_files[csv_files.index(merged_csv)] = prev_merged

with open(merged_csv, 'wb') as ofile:
    csv_writer = csv.writer(ofile)
    written = set()  # unique combinations of column values written
    csv_stream = fileinput.input(csv_files, mode='rb')
    for row in csv.reader(csv_stream, delimiter=','):
        combination = tuple(row[col] for col in columns)
        if combination not in written:
            csv_writer.writerow(row)
            written.add(combination)

if prev_merged:
    os.unlink(prev_merged)  # clean up

print '{!r} file {}written'.format(merged_csv, 're' if prev_merged else '')

见鬼,如果你觉得万圣节有点疯狂,你甚至可以把它做成一行
pd.concat([pd.DataFrame.from_csv(file)for file in glob.glob(“*.csv”))))。删除重复项(cols=COLNAME_LIST)。到_csv('merged.csv')
太棒了-我一直在考虑与熊猫合作,因为我实际上有很多这类东西要处理。与其等到必要的时候再翻译所有的东西,不如现在就开始。这只会根据第2列检查重复项,还是会删除任何列条目上的重复项?我真的需要查找熊猫的基础知识。你可以给它一个列列表,你想在上面检查重复的列(见COLNAME_列表)。在列上添加标签很有帮助(只需将文件的第一行作为标题名即可),但如果不添加标签,则只会添加数字标题。另一件你应该注意的事情是索引,因为它们会自动创建为每行的第一个值。我不确定您的csv文件是如何构造的,但希望这不是您的问题。这两种方法都没什么大不了的我得到了AttributeError:“module”对象没有属性“concat”您使用的熊猫是什么版本的?我在0点12分