Python 根据分隔符|之前的第一个id完全删除csv文件中的重复条目行?

Python 根据分隔符|之前的第一个id完全删除csv文件中的重复条目行?,python,csv,Python,Csv,这里我有一个csv文件: b5711586dc018c1deed6b1ea596da304|f4e3945da368711abb3110b621ceada5c21c11f8|bdf7f718f579d64060c7739225de573e4ffda7fe8b10cdaaeb672de5b7c06 98e|2017-01-20 11:42:12|111|Relative|path 1beb1d0ac2d24cb87d8fe6ce05601136|f5ace00777f68909d10671962

这里我有一个csv文件:

b5711586dc018c1deed6b1ea596da304|f4e3945da368711abb3110b621ceada5c21c11f8|bdf7f718f579d64060c7739225de573e4ffda7fe8b10cdaaeb672de5b7c06  98e|2017-01-20 11:42:12|111|Relative|path
1beb1d0ac2d24cb87d8fe6ce05601136|f5ace00777f68909d106719629c85fb3af23b810|62f6ebb14ede7a1b6307cea5f58a18ff59282650af750a575d1bdb530c04f  11f|2017-01-20 11:42:12|111|Relative|path
b5711586dc018c1deed6b1ea596da304|f4e3945da368711abb3110b621ceada5c21c11f8|bdf7f718f579d64060c7739225de573e4ffda7fe8b10cdaaeb672de5b7c06  98e|2017-01-20 11:43:28|111|Relative|path
1beb1d0ac2d24cb87d8fe6ce05601136|f5ace00777f68909d106719629c85fb3af23b810|62f6ebb14ede7a1b6307cea5f58a18ff59282650af750a575d1bdb530c04f  11f|2017-01-20 11:43:28|111|Relative|path
b5711586dc018c1deed6b1ea596da304|f4e3945da368711abb3110b621ceada5c21c11f8|bdf7f718f579d64060c7739225de573e4ffda7fe8b10cdaaeb672de5b7c06  98e|2017-01-20 11:48:03|111|Relative|path
1beb1d0ac2d24cb87d8fe6ce05601136|f5ace00777f68909d106719629c85fb3af23b810|62f6ebb14ede7a1b6307cea5f58a18ff59282650af750a575d1bdb530c04f  11f|2017-01-20 11:48:03|111|Relative|path
但有多余的行,我想删除,并保留唯一的行

有没有办法用python编写脚本来实现这一点? 我使用了以下脚本:

import csv
with open('results/20_01_2017_db_file.csv','rb') as f:
        reader = csv.reader(f)
        for row in reader:
                print ', '.join(row)
这样做:

import csv
new_rows = set()
with open('results/20_01_2017_db_file.csv','rb') as f:
    reader = csv.reader(f, delimiter='|')
    [new_rows.add(row) for row in reader]

with open('results/20_01_2017_db_fileUniq.csv', 'wb') as fout:
    [fout.writeline(r) for r in list(new_rows)]
这样做:

import csv
new_rows = set()
with open('results/20_01_2017_db_file.csv','rb') as f:
    reader = csv.reader(f, delimiter='|')
    [new_rows.add(row) for row in reader]

with open('results/20_01_2017_db_fileUniq.csv', 'wb') as fout:
    [fout.writeline(r) for r in list(new_rows)]

只能使用以下列表生成包含唯一行的新文件:

def unique(input_file_path, output_file_path):
    unique_ids = []
    with open(input_file_path) as in_file, open(output_file_path, 'w') as out_file:
        for line in in_file:
            tokens = line.split('|',1)
            if tokens[0] not in unique_ids:
                unique_ids.append(tokens[0])
                out_file.write(line)
这样说吧:

unique('path/to/input','path/to/output')

只能使用以下列表生成包含唯一行的新文件:

def unique(input_file_path, output_file_path):
    unique_ids = []
    with open(input_file_path) as in_file, open(output_file_path, 'w') as out_file:
        for line in in_file:
            tokens = line.split('|',1)
            if tokens[0] not in unique_ids:
                unique_ids.append(tokens[0])
                out_file.write(line)
这样说吧:

unique('path/to/input','path/to/output')

使用
集合
记住已看到的所有行,仅打印集合中尚未出现的行:

import csv
with open('a.csv','rb') as f:
  reader = csv.reader(f, delimiter='|')  # need to specify delimiter
  rows_seen = set()
  for row in reader:
    row_key = row[0]
    if row_key not in rows_seen:
      print ', '.join(row) 
    rows_seen.add(row_key)

另请注意,您需要显式指定分隔符(
|
),因为它是非默认分隔符。

使用
记住已看到的所有行,只打印该集中尚未出现的行:

import csv
with open('a.csv','rb') as f:
  reader = csv.reader(f, delimiter='|')  # need to specify delimiter
  rows_seen = set()
  for row in reader:
    row_key = row[0]
    if row_key not in rows_seen:
      print ', '.join(row) 
    rows_seen.add(row_key)
另请注意,您需要显式指定分隔符(
|
),因为它是非默认分隔符。

尝试使用此分隔符

import csv
data = []
with open('results/20_01_2017_db_file.csv','rb') as f:
    reader = csv.reader(f)
    for row in reader:
        if not row in data:
            data.append(row)
试试这个

import csv
data = []
with open('results/20_01_2017_db_file.csv','rb') as f:
    reader = csv.reader(f)
    for row in reader:
        if not row in data:
            data.append(row)

您可以将行作为常规行读取,而不是以逗号分隔的格式读取,这样就可以将行散列到一个集合中

这应该适合您:

with open('results/20_01_2017_db_file.csv','rb') as f:
    line_set = set(f)

with open('results/20_01_2017_db_file_v2.csv', 'wb') as f:
    for line in line_set: f.write(line) 

您可以将行作为常规行读取,而不是以逗号分隔的格式读取,这样就可以将行散列到一个集合中

这应该适合您:

with open('results/20_01_2017_db_file.csv','rb') as f:
    line_set = set(f)

with open('results/20_01_2017_db_file_v2.csv', 'wb') as f:
    for line in line_set: f.write(line) 


你会尝试使用熊猫吗?最后,你想将数据存储到csv或列表中吗?@PoStevanusAndrianta同意Po的观点,使用熊猫要容易得多。(尽管它是为分析工作而设计的)您可以将行读入列表,然后将列表转换为集合。这将自动删除dup行。使用pandas:
pd.read_csv(file,header=None,sep='|')。删除重复项([0,1,2])
您是否尝试使用pandas?最后,您想将数据存储到csv或list?@postevanusandriata同意Po的观点,使用pandas要容易得多。(尽管它是为分析工作而设计的)您可以将行读入列表,然后将列表转换为集合。这应该会自动删除dup行。使用pandas:
pd.read_csv(file,header=None,sep=''|')。drop_duplicates([0,1,2])
TypeError:unhable type:'list'为什么要使用列表理解而不是循环?您的解决方案不会保留顺序。最好使用OrderedSet@shx2出于效率原因,我习惯于理解。另外,您如何保持集合中的顺序?不应使用理解而不是普通循环。这里不使用它有两个原因:您不需要创建列表(列表可能很长,您不需要),循环有副作用(添加到集合中)。对于非常大的文件,这肯定会比较慢。至于保持顺序:要么使用OrderedSet,要么以不同的方式使用该集合。查看我的答案。TypeError:unhabable类型:“list”为什么要使用列表理解而不是循环?您的解决方案不能保持顺序。最好使用OrderedSet@shx2出于效率原因,我习惯于理解。另外,您如何保持集合中的顺序?不应使用理解而不是普通循环。这里不使用它有两个原因:您不需要创建列表(列表可能很长,您不需要),循环有副作用(添加到集合中)。对于非常大的文件,这肯定会比较慢。至于保持顺序:要么使用OrderedSet,要么以不同的方式使用该集合。看我的答案。我想从csv文件中删除重复的行,而不仅仅是打印。@SaiKiran你自相矛盾。您的代码打印,您说要将其添加到DB,现在您说要更改文件。如果你问得不清楚,我们也帮不了你。@SaiKiran,你也没有解释这些行在什么意义上是“重复的”。您发布的文件中的所有行都不同。不要只复制答案。@hd1您的意思是什么?我抄了什么答案?我们的答案非常不同。我想从csv文件中删除重复的行,而不仅仅是打印。@SaiKiran你自相矛盾。您的代码打印,您说要将其添加到DB,现在您说要更改文件。如果你问得不清楚,我们也帮不了你。@SaiKiran,你也没有解释这些行在什么意义上是“重复的”。您发布的文件中的所有行都不同。不要只复制答案。@hd1您的意思是什么?我抄了什么答案?我们的答案非常不同。