You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

错误原因

代码逻辑存在两个核心问题:

  1. 数据格式不匹配:csv.reader读取的每一行是列表类型(比如['Test1', 'Last1', '1101011']),而file.readlines()读取的是文本文件的字符串行列表,直接用row not in x对比完全是不同类型的对象,永远会返回True,所以会打印所有行。
  2. 未解析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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 23:55:27