使用特定于列的重复筛选器将行追加到Python中的CSV
因此,我希望Python使用csv读写器,将目录中的所有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
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分