当前位置: 首页 > 知识库问答 >
问题:

python - 使用Python逐行比对两个TXT文件中每行数据,有相同的数字,但是为何结果好乱啊 ?

东门楚
2023-07-11

两个记事本文件内容

test1

1,2,3,4,5,6
5,6,7,8,9,10
11,12,13,14,15

test2

2,3,4,5,6,7
7,8,9,10,11,12

我想用逐行比对的方法对比 test1 中的第一行与 test2 中的所有行比对,然后是 test1 的第二行,以此类推,查找对比过程中两行数组中是否有 4 个相同的数字,找到的话就返回test2 中对应的行数据,

下面是我的代码,我就写了这么多,最后发现了好多未知的问题,水平太低,进行不下去了,望各位提携~!

import os, linecache

file1 = open('test1.txt','r',encoding= 'gb18030');
arr1 = file1.readlines()
file2 = open('test2.txt','r',encoding= 'gb18030');
arr2 = file2.readlines()

for fields1 in arr1:
    for fields2 in arr2:
        c = set(fields1).intersection(set(fields2))
        d = len(c)
        if d == 4:
            print(list(c), ",", len(c))

返回结果看着好乱:

['2', ',', '3', ',', '4', ',', '5', ',', '6', ',', '7', '\n'] ['7', '5', '6', '\n', ','] , 5
['2', ',', '3', ',', '4', ',', '5', ',', '6', ',', '7', '\n'] ['4', '2', '3', '5', ','] , 5

共有3个答案

缪宪
2023-07-11

代码如下:

def compare_two_files(t1, t2):
    # 读取文件1
    with open(t1) as f1:
        # 死循环读取文件1
        while True:
            # 去除每一行的换行符
            f1_line = f1.readline().rstrip("\n")

            # 如果读完了,就break,退出当前循环
            if not f1_line:
                break

            # 读取文件2
            with open(t2) as f2:
                # 死循环读取文件2
                while True:
                    # 去除每一行的换行符
                    f2_line = f2.readline().rstrip("\n")

                    # 如果读完了,就break,退出当前循环
                    if not f2_line:
                        break

                    # 将f1、f2的每一行字符串使用字符串 `split` 函数
                    # 以 ``,`` 进行分割,并使用set函数转为集合对象
                    f1_set = set(f1_line.split(","))
                    f2_set = set(f2_line.split(","))

                    # 对两个集合求交集
                    intersection_set = f1_set.intersection(f2_set)

                    # 判断交集的长度,若大于等于4,则print(f2_line)
                    if len(intersection_set) >= 4:
                        print(f2_line)


if __name__ == "__main__":
    compare_two_files("test1.txt", "test2.txt")
邓卓
2023-07-11

arr1 = ["1,2,3,4,5,6", "5,6,7,8,9,10", "11,12,13,14,15"]
arr2 = ["2,3,4,5,6,7", "7,8,9,10,11,12"]

for fields1 in arr1:
    nums1 = set(fields1.split(','))  # 把字符串按逗号分割成单独的数字,并去重
    for fields2 in arr2:
        nums2 = set(fields2.split(','))  # 同上
        c = nums1.intersection(nums2)  # 求两个集合的交集
        d = len(c)
        if d >= 4:  # 满足条件则打印并终止搜索
            print(fields2)
            break
沃弘图
2023-07-11

因为你的代码的遍历过程,包括了逗号和换行符,所以导致匹配出现混乱。有几种思路做法,比如说我们可以写两个遍历,一个全部录入,第二个循环删掉一些字符(逗号,换行符)做筛选,当然我个人觉得最简单的是使用split()函数将每行的字符串按逗号分隔成列表,然后再进行比对。

file1 = open('test1.txt', 'r', encoding='gb18030')
arr1 = file1.readlines()
file2 = open('test2.txt', 'r', encoding='gb18030')
arr2 = file2.readlines()

for line1 in arr1:
    line1 = line1.strip()  # 去除行尾的换行符
    list1 = line1.split(',')  # 将字符串按逗号分隔成列表

    for line2 in arr2:
        line2 = line2.strip()  # 去除行尾的换行符
        list2 = line2.split(',')  # 将字符串按逗号分隔成列表

        common_elements = set(list1) & set(list2)  # 找到两个列表的共同元素
        if len(common_elements) == 4:
            print(list(common_elements), ",", len(common_elements))
 类似资料:
  • 我正在试着阅读我的文件的每一行,其中包含一个用户名列表,并用它创建一个登录系统。我正在尝试实现一个基本的登录系统,它的用户名存储在.txt文件中,但我的代码不工作,我不知道为什么。我认为问题出在检查用户名的循环中。 这是我的代码,但它不起作用,只是打印总是失败: 有什么想法吗?

  • 我在python中有两个不同长度的数据帧,如下所示: 我现在要做的是比较df1的Column1和df2的ColumnA。对于每个“命中”,其中df2中ColumnA中的一行与df1中Column1中的一行具有相同的值,我想在df1中附加一列,其中df2的vaule ColumnB对于找到“命中”的行具有相同的值,因此我的结果如下所示: 到目前为止,我尝试的是: 这给了我一个错误,说我不能比较两个不

  • 我正在努力阅读附加的TXT文件,以csv形式显示从文件中读取的每个字段,我做了一个接近我想要的代码,但我没有前进。 TXT文件格式: 我的代码在我想要的位置读取第一行,但下面的行我不能,更不用说重复文件中包含的下一个工资单的读数了。 目前的输出是这样的: 出口应该是怎样的 逐行读取和捕获数据,我必须完成一个工资单,它将在输出中形成一行,第二个工资单将在输出中形成第二行,因此,直到txt文件结束,此

  • 问题内容: 使用“ is”运算符或“ ==”运算符在Python中比较两个数字是否更好? 例子: 问题答案: 使用。 有时候,在某些python实现中,巧合的是,可以使用-5到256之间的整数(例如,在CPython实现中)。但是不要依赖于此或在实际程序中使用它。

  • 问题内容: 是python编程的新手。任何人都可以检查以下语法是否满足以下条件: 获取此异常 - ValueError异常:一个系列的真值是不明确的。 使用a.empty,a.bool(),a.item(),a.any()或a.all()。 问题答案: 您比较的是数组,没有标量,因此Camparing的输出是另一个数组。所以需要还是。也需要两者的长度相同:

  • 问题内容: 为什么我不能对相同的数据进行两次迭代? 这将打印“执行一次”几次(由于数据有几行),但是根本不会打印“执行两次”。 我第一次遍历数据工作正常,但是第二次当我运行最后一个列表“针对数据行”时,此操作什么都不返回……因此一次执行它却不能两次……? 仅供参考-数据是一个csv.reader对象(如果是原因)… 问题答案: 这是因为它data是一个迭代器,你只能使用一次迭代器。例如: 如果我们