如何删除基于另一CSV的CSV中的行

时间:2019-06-13 19:56:58

标签: python-3.x csv compare

我正在处理两个CSV文件,它们都只包含一列数据,但超过50,000行。我需要比较CSV1和CSV2中的数据,并删除这两个文件中显示的所有数据。如果可能的话,我想将最终数据列表打印为第三个CSV文件。

CSV文件包含用户名。我曾尝试运行重复数据删除脚本,但意识到这不会完全删除两个CSV文件中找到的条目,因为它只会删除用户名的重复项。这是我目前正在使用的工具,但是我已经知道这不会给我想要的结果。

var WidgetLAECarouselHandler = function ($scope, $) {    
  var carousel_elem = $scope.find('.lae-carousel, .lae-posts-carousel, .lae-gallery-carousel, .lae-services-carousel').eq(0);
  if (carousel_elem.length > 0) {    
    var settings = carousel_elem.data('settings');    
    var arrows = settings['arrows'];
    var dots = settings['dots'];
    var autoplay = settings['autoplay'];

我编写此代码的方式将在运行脚本后在终端中打印结果,但我意识到我的输出可能约为1000个条目。

1 个答案:

答案 0 :(得分:0)

# define the paths
fpath1 = "/path/to/file1.csv"
fpath2 = "/path/to/file2.csv"
fpath3 = "/path/to/your/file3.csv"

with open(fpath1) as f1, open(fpath2) as f2, open(fpath3, "w") as f3:
    l1 = f1.readlines()
    l2 = f2.readlines()
    not_in_both = [x for x in set(l1 + l2) if x in l1 and x in l2]
    for x in not_in_both:
        print(x, file=f3)

with open() as ...子句负责关闭文件。 您可以在with下合并几个文件开头。 假设文件中的元素是每行唯一的元素,我使用了简单的readlines()(它会自动删除结尾的换行符)。否则,它将在此步骤中变得更加复杂。 使用列表表达式可以很好地按条件过滤列表。 end='\n'中的默认print()在每次打印结束时都会添加换行符。

以您的方式

有关格式代码,请遵循官方的样式指南,例如 https://www.python.org/dev/peps/pep-0008/

def select_exclusive_accounts(path_to_f1,path_to_f2, path_to_f3): 
    # you have quite huge indentations - use 4 spaces!
    with open(path_to_f1) as f1, open(path_to_f2) as f2, \
                                      open(path_to_f3, "w") as f3:
    for item in in_f1:
        if item not in in_f2:
            f3.write(item)
    for i in in_f2:
        if i not in in_f1:
            f3.write(item)

select_exclusive_accounts("AD_Accounts.csv", 
                          "BA_Accounts.csv", 
                          "exclusive_accounts.csv")

这里也不需要导入,因为这些是标准的Python命令。