【问题标题】:Iterating over a csv file given a specific range在给定特定范围的情况下迭代 csv 文件
【发布时间】:2016-11-27 07:19:33
【问题描述】:

所以我遇到的问题是我正在迭代一个非常大的 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)

【问题讨论】:

  • 您知道所需范围的确切行吗?
  • 我不是阿明,我要求输入所需的开始日期和结束日期。所以它总是会根据他们输入的内容而有所不同
  • 日期的格式是什么?你做int(startDate) ...它是一个整数?

标签: python csv


【解决方案1】:

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

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),速度很快。

【讨论】:

  • 如果您知道日期始终是四位数年份,则可以跳过转换为 int。
【解决方案2】:

你可以试试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

【讨论】:

    猜你喜欢
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 2022-11-12
    • 1970-01-01
    相关资源
    最近更新 更多