比较两个csv文件,如果两个字段之间存在匹配,请执行某些操作

2024-10-04 01:24:04 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有一个嵌套的for循环

for rowst in student:
    for rowtu in tutor:
        if rowst['RegGroup'][-3:] in rowtu['StaffCode']:
            print (rowst['RegGroup'][-3:],rowtu['StaffCode'])
            print("----------------------------------------")

学生是student = csv.DictReader(fr) 导师是tutor = csv.DictReader(fr2)

我试图实现的是比较这两个文件,以检查学生RegGroup中的最后3个字符是否与tutors staffcode匹配。然后打印代码中显示的内容。在

我得到的结果是:

^{pr2}$

这表明它只为first for循环的第一个或最后一个值工作,这不是我想要的。我已经检查过了,是的,有多个注册组匹配,因为我使用学生文件中的注册组来填充一个唯一的导师员工代码列表。在

有人能告诉我哪里出了问题,因为我的朋友似乎认为我的实现应该有效?在

根据要求,一些csv数据(由于gdpr原因无法共享,但可以显示im比较的两个字段)

在导师.csv在

StaffCode
FLI
RTH
POD
DFI
LNO
VAI
HPI
LNE
SLA
ASP
HST
RCO
WKI
GBA
RKI
BPE
SMI
NRY
CSC

的子集学生.csv(XX代表一个年组)

RegGroup
XXFLI
XXRTH
XXPOD
XXDFI
XXLNO
XXVAI
XXFLI
XXLNO
XXHPI
XXLNO
XXPOD
XXHPI
XXLNE
XXLNO
XXRTH
XXHPI
XXRTH
XXLNO
XXVAI
XXDFI
XXVAI
XXFLI
XXRTH
XXFLI
XXLNE
XXDFI
XXVAI
XXLNE

Tags: csvinfor学生导师reggroupxxrthxxhpi
2条回答

dictReader是一个迭代器,它遍历文件一次,在读取一次文件后必须重新启动。在

下面是一个代码示例,它很有用,但并不十分优雅:

with open("tutor.csv") as stu:
    student = csv.DictReader(stu)
    for rowst in student:
        with open("student.csv") as tu:
            tutor = csv.DictReader(tu)
            for rowtu in tutor:
                if rowst['RegGroup'][-3:] in rowtu['StaffCode']:
                    print (rowst['RegGroup'][-3:],rowtu['StaffCode'])
                    print("                    ")

“with open…”一行创建了一个上下文,在该上下文中文件可用,然后自动关闭。但是对于大文件,这不是您想要重复的,您应该将数据存储在适当的对象中。在

为此,您可以使用numpy.loadtxt之类的东西。在

程序试图比较中的每一行中的值学生.csv与导师.csv. 但是,我从您需要的理解是加入StaffCode列上的两个数据集。因此,常规的csv读写可能很难做到,我建议使用熊猫,这将有助于。这是密码。

import pandas as pd
stu = pd.read_csv('./data/students.csv')
tutors = pd.read_csv('./data/tutors.csv')
stu.head()
Out[19]: 
  RegGroup
0    XXFLI
1    XXRTH
2    XXPOD
3    XXDFI
4    XXLNO
tutors.head() # i added a column as 'Staff Name' for fun
Out[20]: 
  StaffCode  Staff Name
0       FLI      Fly Li
1       RTH      Ruth G
2       POD     Podrick
3       DFI   Daren Fli
4       LNO      Lenord
# extract the last three characters as 'StaffCode'
stu['StaffCode'] = stu.apply(lambda row: row['RegGroup'][-3:], axis=1)
stu.head()
Out[22]: 
  RegGroup StaffCode
0    XXFLI       FLI
1    XXRTH       RTH
2    XXPOD       POD
3    XXDFI       DFI
4    XXLNO       LNO
stu_new = pd.merge(stu, tutors, how='left', on=['StaffCode']) # merge it on the StaffCode column and do some cool stuff
stu_new.head()
Out[24]: 
  RegGroup StaffCode  Staff Name
0    XXFLI       FLI      Fly Li
1    XXRTH       RTH      Ruth G
2    XXPOD       POD     Podrick
3    XXDFI       DFI   Daren Fli
4    XXLNO       LNO      Lenord

只是代码

^{pr2}$

相关问题 更多 >