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

时间:2019-01-26 12:14:12

标签: 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:
        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()

2 个答案:

答案 0 :(得分:1)

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

我添加了一些方法来尝试使它更清洁并帮助您继续学习:

  1. 我使用了with 上下文管理器,它在读取完文件后自动关闭文件。无需.close()
  2. 我已经将csv阅读代码打包到一个函数中。现在我们只需要编写该部分一次,就可以使用任何文件调用该函数。
  3. 我已使用csv模块读取文件。这将返回嵌套的行列表,每个内部列表代表单个行。
  4. 我使用了 list理解,这是一种编写for循环以创建列表的更简洁的方法。在这种情况下,它是file_1第一栏中所有项目的列表。
  5. 我已经将第4点中的列表转换为一个 set 。当我们遍历file_2时,我们可以非常快速地检查是否在file_1中看到了行值({set查找为O(1),而不必每次都遍历file_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])

答案 1 :(得分:0)

file1 = open("../dir/file1.csv", "r")
file2 = open("../dir/file2.csv", "r")
for line in file1:
    file1splitted = line.strip().split(",")
    for line in file2:
        file2splitted = line.strip().split(",")
        if file1splitted[0] == file2splitted [2]:
            print (file1splitted[0],file1splitted[1], file2splitted[6], file2splitted[10], file2splitted[12])

file1.close()
file2.close()

如果您提供csv文件,那么我可以为您提供更多帮助。

相关问题