我有一个如下所示的数据集:
id,created_at,username
1,2006-10-09T18:21:51Z,hey
2,2007-10-09T18:30:28Z,bob
3,2008-10-09T18:40:33Z,bob
4,2009-10-09T18:47:42Z,john
5,2010-10-09T18:51:04Z,brad
...
我包含1M +行。 我想使用python从中提取用户名列表而不重复。到目前为止,我的代码看起来像这样:
import csv
file1 = file("sample.csv", 'r')
file2 = file("users.csv", 'w')
reader = csv.reader(file1)
writer = csv.writer(file2)
rownum = 0
L = []
for row in reader:
if not rownum == 0:
if not row[2] in L:
L.append(row[2])
writer.writerow(row[2])
rownum += 1
我有几个问题: 1 - users.csv中的输出如下所示:
h,e,y
b,o,b
j,o,h,n
b,r,a,d
如何删除每个字母之间的逗号?
2 - 我的代码不是很优雅,有没有办法将csv文件作为矩阵导入以选择最后一行,然后在javascript中使用像underscore.js这样的优雅库来删除重复项?
非常感谢
答案 0 :(得分:5)
您可以在此处使用set
,与O(1)
列表相比,它提供O(N)
项目查找。
seen = set()
add_ = seen.add
next(reader) #skip header
writer.writerows([row[-1]] for row in reader if row[-1] not in seen
and not add_(row[-1]))
并始终使用with
语句处理文件,它会自动为您关闭文件:
with file("sample.csv", 'r') as file1, file("users.csv", 'w') as file2:
#Do stuff with file1 and file2 here
答案 1 :(得分:0)
更改
writer.writerow(row[2])
到
writer.writerow([row[2]])
另外,检查列表中的成员资格是计算上昂贵的[O(n)]。如果您要检查大量项目的成员资格并经常这样做,请使用set
[O(1)]:
L = set()
reader.next() # Skip the header
for row in reader:
if row[2] not in L:
L.add(row[2])
writer.writerow([row[2]])
如果您可以使用几兆内存,请执行以下操作:
with open("sample.csv", "rb") as infile:
reader = csv.reader(infile)
reader.next()
no_duplicates = set(tuple(row) for row in reader)
with open("users.csv", "wb") as outfile:
csv.writer(outfile).writerows(no_duplicates)
如果订单很重要,请使用OrderedDict
代替集合:
from collections import OrderedDict
with open("sample.csv", "rb") as infile:
reader = csv.reader(infile)
reader.next()
no_duplicates = OrderedDict.fromkeys(tuple(row) for row in reader)
with open("users.csv", "wb") as outfile:
csv.writer(outfile).writerows(no_duplicates.keys())
答案 2 :(得分:-1)
轻松简短!
for line in reader:
string = str(line)
split = string.split("," , 2)
username = split[2][2:-2]