我想做的是打开两个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()
答案 0 :(得分:1)
您应该使用csv
module来读取这些文件,因为用逗号分割不可靠;单个CSV列包含本身包含逗号的值就可以了。
我添加了一些方法来尝试使它更清洁并帮助您继续学习:
with
上下文管理器,它在读取完文件后自动关闭文件。无需.close()
csv
模块读取文件。这将返回嵌套的行列表,每个内部列表代表单个行。for
循环以创建列表的更简洁的方法。在这种情况下,它是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文件,那么我可以为您提供更多帮助。