Python 代码多次返回同一行,而不是多行

Python 代码多次返回同一行,而不是多行,python,csv,output,Python,Csv,Output,我要做的是打开两个CSV文件,只打印文件1和文件2中列内容匹配的行。我已经知道我应该得到14个结果,但是我正在处理的CSV文件的第一行会被打印14次。我哪里出错了 file1 = open("../dir/file1.csv", "r") for line in file1: file1splitted = line.strip().split(",") file2 = open("../dir/file2.csv", "r") for line in file2:

我要做的是打开两个CSV文件,只打印文件1和文件2中列内容匹配的行。我已经知道我应该得到14个结果,但是我正在处理的CSV文件的第一行会被打印14次。我哪里出错了

file1 = open("../dir/file1.csv", "r")
for line in file1:
    file1splitted = line.strip().split(",")

    file2 = open("../dir/file2.csv", "r")
    for line in file2:
        file2splitted = line.strip().split(",")

        for line in file1:
            if file1splitted[0] == file2splitted [2]:
                print (file1splitted[0],file1splitted[1], file2splitted[6], file2splitted[10], file2splitted[12])

file1.close()
file2.close()
如果您提供您的csv文件,那么我可以为您提供更多帮助。

您应该使用来读取这些文件,因为使用逗号拆分是不可靠的;单个CSV列包含本身包含逗号的值是可以的

我添加了一些东西,试图让这更干净,并帮助您在学习中取得进步:

我使用了上下文管理器,它可以在您完成读取后自动关闭文件。不用了,关了 我已经将csv读取代码打包到一个函数中。现在我们只需要写一次这个部分,就可以用任何文件调用这个函数。 我已经使用csv模块来读取文件。这将返回一个嵌套的行列表,每个内部列表表示一行。 我使用了列表理解,这是一种更简洁的方式来编写创建列表的for循环。在本例中,它是文件_1第一列中所有项目的列表。 我已将第4点中的列表转换为一组。当我们迭代文件_2时,我们可以非常快速地检查是否在文件_1集合查找中看到行值为O1,而不必每次迭代文件_1。 我打印的索引来自我自己的测试文件,您需要根据自己的用例调整它们

import csv

def read_csv(file_name):
    with open(file_name) as infile: # Context manager to auto-close files at end
        reader = csv.reader(infile)
        #next(reader) remove the hash if you want to drop the headers
        return list(reader)


file_1 = read_csv('file_1.csv')
file_2 = read_csv('file_2.csv')

# Make a set of file_1 column 0 with a list comprehension
file_1_vals = set([item[0] for item in file_1])

# Now iterate through file_2
for row in file_2:
    if row[2] in file_1_vals:
        print(row[1])

您正在嵌套循环中践踏line循环变量。我不确定这是否是问题的原因,但我建议在为循环打开内部文件时,使用不同的clarityBe名称。这可能会给你带来一些麻烦。不确定这是否是问题所在。我更喜欢使用带with语句的open,这样即使出现错误,它也会关闭:with open../dir/file1.csv,r as file1:这不是读取csv文件的好方法。我们有这个csv模块task@roganjosh你们说得很对,我的重点是逻辑,为什么麦克鲁普得到了错误的结果
import csv

def read_csv(file_name):
    with open(file_name) as infile: # Context manager to auto-close files at end
        reader = csv.reader(infile)
        #next(reader) remove the hash if you want to drop the headers
        return list(reader)


file_1 = read_csv('file_1.csv')
file_2 = read_csv('file_2.csv')

# Make a set of file_1 column 0 with a list comprehension
file_1_vals = set([item[0] for item in file_1])

# Now iterate through file_2
for row in file_2:
    if row[2] in file_1_vals:
        print(row[1])