Python 根据分隔符|之前的第一个id完全删除csv文件中的重复条目行?
这里我有一个csv文件:Python 根据分隔符|之前的第一个id完全删除csv文件中的重复条目行?,python,csv,Python,Csv,这里我有一个csv文件: b5711586dc018c1deed6b1ea596da304|f4e3945da368711abb3110b621ceada5c21c11f8|bdf7f718f579d64060c7739225de573e4ffda7fe8b10cdaaeb672de5b7c06 98e|2017-01-20 11:42:12|111|Relative|path 1beb1d0ac2d24cb87d8fe6ce05601136|f5ace00777f68909d10671962
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您的意思是什么?我抄了什么答案?我们的答案非常不同。