代码之家  ›  专栏  ›  技术社区  ›  user_01

在另一个文件中搜索文件的行并在python中打印适当的行

  •  1
  • user_01  · 技术社区  · 8 年前

    我有这样一个csv文件:(没有标题)

    aaa,1,2,3,4,5  
    bbb,2,3,4,5,6
    ccc,3,5,7,8,5
    ddd,4,6,5,8,9
    

    我想搜索另一个csv文件:(无标题)

    bbb,1,2,3,4,5,,6,4,7
    kkk,2,3,4,5,6,5,4,5,6
    ccc,3,4,5,6,8,9,6,9,6
    aaa,1,2,3,4,6,6,4,6,4
    sss,1,2,3,4,5,3,5,3,5
    

    并打印第二个文件中存在于第一个文件中的行(基于第一列的匹配)。因此,结果将是:

    bbb,1,2,3,4,5,,6,4,7
    ccc,3,4,5,6,8,9,6,9,6
    aaa,1,2,3,4,6,6,4,6,4 
    

    我有以下代码,但它不会打印任何内容:

    labels = []
    with open("csv1.csv", "r") as f:
    
        f.readline()
        for line in f:
            labels.append((line.strip("\n")))
    
    with open("csv2.csv", "r") as f:
    
        f.readline()
        for line in f:
            if (line.split(",")[1]) in labels:
                print (line)
    

    2 回复  |  直到 8 年前
        1
  •  1
  •   atru    8 年前

    这是一种解决方案,不过您也可以根据建议查看csv特定工具和pandas:

    labels = []
    with open("csv1.csv", "r") as f:
        lines = f.readlines()
        for line in lines:
            labels.append(line.split(',')[0])
    
    with open("csv2.csv", "r") as f:
        lines = f.readlines()
    
    with open("csv_out.csv", "w") as out:
        for line in lines:
            temp = line.split(',')
            if any(temp[0].startswith(x) for x in labels):
                out.write((',').join(temp))
    

    该程序首先只从 csv1.csv -注意,您使用了 readline ,程序似乎希望一次读取文件中的所有行。一种方法是使用 readlines . 程序还必须从 阅读行 lines . 为了收集标签,程序循环遍历每一行,用一个 , labels .

    在第二部分中,程序读取 csv2.csv 同时打开文件以写入输出, csv.out . 它处理来自 csv2.csv 逐行执行,同时将目标文件写入输出文件。

    为此,程序再次将每一行拆分为 , 看看标签是否来自 csv2 标签 大堆如果是,则将该行写入 csv_out.csv .

        2
  •  0
  •   Samantha    8 年前

    编辑

    labels = []
    with open("csv1.csv", "r") as f:
    
        f.readline()
        for line in f:
            labels.append((line.split(',')[0])
    
    with open("csv2.csv", "r") as f:
    
        f.readline()
        for line in f:
            if (line.split(",")[0]) in labels:
                print (line)
    

    ['aaa','bbb', etc]

    那么你要检查一下 line.split(",")[0] 在标签中

    由于只希望基于第一列进行匹配,因此应该使用split,然后从索引0处的拆分中获取第一项。