在给定特定范围的情况下迭代csv文件

时间:2016-11-27 07:19:33

标签: python csv

所以我遇到的问题是我正在迭代一个非常大的csv文件。 startDate和endDate是用户给我的输入,我只需要在该范围内搜索。

虽然,当我运行程序到那时为止,只需要花费很长时间向我吐出“set()”。我已经指出了我在代码中遇到麻烦的地方

寻找建议和可能的示例代码,提前谢谢大家!

def compare(word1, word2, startDate, endDate):
    with open('all_words.csv') as allWords:
        readWords = csv.reader(allWords, delimiter=',')
        year = set()
        for row in readWords:
            if row[1] in range(int(startDate), int(endDate)): #< Having trouble here
                if row[0] == word1:
                    year.add(row[1])
        print(year)

2 个答案:

答案 0 :(得分:3)

您的测试未找到任何年份的原因是表达式:

row[1] in range(int(startDate), int(endDate))

正在检查字符串值是否出现在整数列表中。如果你测试:

"1970" in range(1960, 1980)

你会看到它返回False。你需要写:

int(row[1]) in range(int(startDate), int(endDate))

然而,这仍然是非常低效的。正在检查值int(row[1])是否出现在序列[int(startDate), int(startDate)+1, ..., int(endDate)]中的任何位置,并且它是通过线性搜索进行的。会更快:

if int(startDate) <= int(row[1]) < int(endDate):

请注意,您上面的代码是为了排除endDate的可能日期列表而编写的(因为范围排除了第二个参数),并且我已经完成了相同的操作。

编辑:实际上,我想我应该指出,它只是Python 2,其中像500000 in range(1, 1000000)这样的表达式效率低下。在Python 3中(或在Python 2中使用xrange代替range),它很快。

答案 1 :(得分:1)

您可以尝试pandas库的read_csv功能。此功能允许您每次读取所需的数据量。所以你可以克服尺寸问题。

reader = pd.read_csv(file_name, chunksize=chunk_size, iterator=True)

while True:
    try:
        df = reader.get_chunk(chunk_size)
        # select data rows which have desired dates
    except:
        break
    del df