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