所以我有一个嵌套的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个字符是否与导师的职员代码匹配。然后打印代码中所示的内容。
我得到的结果是:
FLI FLI
----------------------------------------
这表明它仅适用于第一个for循环的第一个或最后一个值,这不是我想要的。我已经检查了,是的,有多个匹配的注册表组,因为我使用了学生文件中的注册表组来填充唯一的教师职员代码列表。
谁能告诉我我要去哪里错了,因为我的朋友似乎认为我的实现应该可行?
根据要求,某些csv数据(由于gdpr原因无法共享,但可以显示两个字段进行即时比较)
tutors.csv
StaffCode
FLI
RTH
POD
DFI
LNO
VAI
HPI
LNE
SLA
ASP
HST
RCO
WKI
GBA
RKI
BPE
SMI
NRY
CSC
students.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
答案 0 :(得分:1)
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之类的东西。
答案 1 :(得分:1)
程序正在尝试将student.csv中同一行中每个行中的值与tutor.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
只需代码
import pandas as pd
stu = pd.read_csv('./data/students.csv')
tutors = pd.read_csv('./data/tutors.csv')
stu.head()
tutors.head()
stu['StaffCode'] = stu.apply(lambda row: row['RegGroup'][-3:], axis=1)
stu.head()
stu_new = pd.merge(stu, tutors, how='left', on=['StaffCode'])
stu_new.head()