我只是在学习Python,众所周知,最好的方法是练习;) 现在我有一份工作,我想尝试用python来做,但是我需要一些建议。
嗯...我有几个CSV文件。结构如下:
第一个CVS workerID,workerName,workerPhoneNumber
第2个和其他CSV包含此第一个集合的子集。
我的意思是,在第一个文件中,例如,有10,000名员工,并且在每个文件中,都有一部分是相同的员工。 例如: 在第一个文件中,我有
00001 Randal 555555
00002 Tom 66666
00003 Anthony 77775
00004 Mark 3424435
00005 Anna 3443223
00006 Monica 412415415
.....
在第二个文件中:
00001 Randal 555555
00004 Mark 3424435
00006 Monica 412415415
....
和第3个文件:
00001 Randal 555555
00004 Mark 3424435
00005 Anna 3443223
....
我必须检查所有文件中所有用户的有效性。我的意思是:比安娜检查所有文件在其他文件管理器中具有相同的ID和电话,并针对所有结果进行相同的检查(那是10万行的巨大文件)。然后,我将退回所有不匹配的内容。 另外一个问题是行中有一些“ NA”。
我刚刚完成了一个numpy教程,但是我不知道如何咬它。我什至不知道使用numpy的好习惯。所以我需要你的建议...我该如何解决这个问题?
编辑:作品具有唯一的名称:)它的随机字符串实际上不是名称:D只是示例:D在单个文件ID中也是唯一的
答案 0 :(得分:1)
使用标准功能和数据结构就足够了。 让我们使用列表推导用字典列表来表示文件:
header = ('id', 'name', 'phone_number')
records_1 = [{k:v for k, v in zip(header, line.strip().split(' ')} } for line in open('path_to_file1', 'r')]
records_2 = [{k:v for k, v in zip(header, line.strip().split(' ')} } for line in open('path_to_file2', 'r')]
然后,如果要基于用户名检查记录,请使用名称为键,记录为值的字典:
records_1 = {rec['name']: rec for rec in records_1}
records_2 = {rec['name']: rec for rec in records_2}
,并检查每个名称是否有重复的ID。如果是这样,请将其保存到输出:
seen = {}
output = []
for records, others in [(records_1, records_2), (records_2, records_1)]:
for name, rec in records:
if name in seen:
continue
if rec['id'] != others['name']['id']:
output.append((name, rec, others['name']))
请注意,我们可以使用itertools中的排列推导排列列表: https://docs.python.org/3/library/itertools.html
希望这会有所帮助!