在另一个文件中搜索文件的行并在python

时间:2017-10-16 23:54:42

标签: python file csv read-write

我有一个像这样的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 个答案:

答案 0 :(得分:1)

这是一个解决方案,尽管您也可以按照建议查看特定于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。该程序还必须从readlines收集行 - 在此处将它们存储在名为lines的列表中。为了收集标签,程序循环遍历每一行,用,分割,然后将第一个元素附加到带有标签labels的数组。

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

为此,程序再次按,拆分每一行,并查看csv2数组中是否找到labels的标签。如果是,该行将写入csv_out.csv

答案 1 :(得分:0)

  • 尝试使用Playground,这是将csv文件读入名为dataframes的数据结构的一种非常有效的方法。

修改

#include <stdio.h>

void outputDate(courseInfo course);

typedef struct{
    int year;
    int month;
    int day;
}date;

typedef struct{
    double avrage;
    int students;
    date start;
    date end;

}courseInfo;

int main(void){

    courseInfo course;
    course.avrage = 10;
    course.students=200
    course.start={17,17,17};
    course.end={16,16,16};


    outputDate();

    return 0;
}

void outputDate(courseInfo course){
    printf("avrage%d\n", course.avrage);
    printf("students%d\n", course.students);
    printf("start%d\n", course.start);
    printf("end%d\n", course.end);
    return;
}

我这样,标签只包含字符串的第一部分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]是否在标签中

由于您只希望根据第一列匹配它,因此您应该使用拆分,然后从分割中获取索引为0的第一个项目。