如何基于列字符串过滤csv文件中的行

时间:2017-06-01 11:30:26

标签: python csv

我正在尝试遍历csv文件中的列表,以查找最后一列包含股票代码符号的行,以查找特定符号,然后将该行写入新的csv文件。不确定有什么问题。 csv文件包含每日股票报价。

def filter_csv():
    import csv
    with open('SP_comb_with_header.csv','r') as fin:
        with open ('SP_filtered.csv','w') as fout:
            writer = csv.writer(fout)            
            for row in csv.reader(fin):
                if fin['Ticker'] == "AAPL":
                    writer.writerow(row)

2 个答案:

答案 0 :(得分:3)

如果您使用的是CSV库(假设您使用的是Python 2.x),通常应该以二进制模式打开文件(请参阅usage example)。标准阅读器会将每行作为列表提供给您,因此最后一列将为row[-1]

import csv

def filter_csv():
    with open('SP_comb_with_header.csv', 'rb') as f_input, open('SP_filtered.csv', 'wb') as f_output:
        csv_input = csv.reader(f_input)
        csv_output = csv.writer(f_output)

        for row in csv_input:
            if row[-1] == "AAPL":
                csv_output.writerow(row)

答案 1 :(得分:0)

如果您想使用其标题名称访问列,则需要csv.DictReader

import csv

def filter_csv():
    symbols = set(['AAPL', 'GOOGL'])
    with open('SP_comb_with_header.csv') as csv_in:
        reader = csv.DictReader(csv_in)
        with open('SP_filtered.csv', 'w') as csv_out:
            writer = csv.DictWriter(csv_out, reader.fieldnames)
            for row in reader:
                if row['Ticker'] in symbols:
                    writer.writerow(row)

请注意,如果您要将csv.DictReader的行写入另一个CSV文件,可以使用csv.DictWriter,如上所示。此解决方案使用set来加快查找速度。