Python中对比CSV与TXT文件的姓名及账号ID数据问题
Python对比两个文件指定字段值的问题解决
我有两个文件,需要在Python中对比其中的firstname、lastname和account_id字段值。文件内容如下:
文件内容
users.csv(列名:first_name、last_name、id)
Test1,Last1,1101011 Test2,Last2,1231231
user1.txt
[{'firstname': 'Test1', 'time_utc': 1672889600.0, 'lastname': 'Last1', 'name': 'Test Last1', 'account_id': 1101011}, {'firstname': 'Test2', 'time_utc': None, 'lastname': 'Last2', 'name': 'Test2 Last2', 'account_id': 1231231}]
我尝试了以下代码,但返回错误结果——即便数据在两个文件中都存在,仍返回所有用户:
import csv with open ("users.csv", 'r') as read_csv: f = csv.reader(read_csv) with open ("user1.txt", 'r') as file: x = file.readlines() print (x) for row in f: print(row) if row not in x: print (row)
错误原因
代码逻辑存在两个核心问题:
- 数据格式不匹配:
csv.reader读取的每一行是列表类型(比如['Test1', 'Last1', '1101011']),而file.readlines()读取的是文本文件的字符串行列表,直接用row not in x对比完全是不同类型的对象,永远会返回True,所以会打印所有行。 - 未解析user1.txt的结构:user1.txt里的内容是Python字典的列表字符串,你没有把它解析成可操作的Python对象,而是直接当作纯文本处理,根本无法提取指定字段做对比。
正确解决方案
我们需要先把两个文件的内容都解析成结构化数据,提取需要对比的字段,再进行对比。这里可以用ast.literal_eval来解析user1.txt里的字典列表:
import csv import ast # 解析user1.txt,提取需要的字段 with open("user1.txt", 'r') as file: # 将文本内容解析为Python列表对象 user_list = ast.literal_eval(file.read()) # 把需要对比的字段转换成元组,存入集合方便快速查找 user_set = set() for user in user_list: # 注意account_id是整数,csv里的id是字符串,要统一类型 user_tuple = (user['firstname'], user['lastname'], str(user['account_id'])) user_set.add(user_tuple) # 读取users.csv,对比每个用户 with open("users.csv", 'r') as read_csv: reader = csv.reader(read_csv) for row in reader: # csv的行对应:first_name, last_name, id csv_tuple = (row[0], row[1], row[2]) if csv_tuple not in user_set: print(f"用户{csv_tuple}在user1.txt中不存在") else: print(f"用户{csv_tuple}在两个文件中都存在")
代码说明
- 使用
ast.literal_eval安全解析user1.txt中的字典列表字符串,转换为可操作的Python对象。 - 将需要对比的三个字段组合成元组,存入集合
user_set,集合的查找效率远高于列表。 - 统一字段类型:csv中的
id是字符串,user1.txt中的account_id是整数,转换为相同类型后再对比,避免类型不匹配导致的判断错误。 - 遍历csv的每一行,提取对应字段组成元组,和集合中的元素对比,输出结果。
内容的提问来源于stack exchange,提问作者beginner_user
相关产品推荐
相关产品推荐

