我有来自同一来源的2个.csv数据集。我试图检查第一个数据集中的任何项目是否仍然存在于第二个数据集中。
<SELECT id="htsize" name="htsize" style="width:100px; font-size:10px;">
<option value=""> SELECT ONE </option>
<option value="12">12px</option>
<option value="13">13px</option>
<option value="14">14px</option>
<option value="15">15px</option>
<option value="16">16px</option>
<option value="17">17px</option>
<option value="18">18px</option>
<option value="19">19px</option>
<option value="20">20px</option>
<option value="21">21px</option>
<option value="22">22px</option>
<option value="23">23px</option>
<option value="24">24px</option>
<option value="25">25px</option>
<option value="26">26px</option>
<option value="27">27px</option>
<option value="28">28px</option>
<option value="29">29px</option>
<option value="30">30px</option>
</select>
<div id="headline2" class="heading" style="position: relative; zindex: 99; width: 220px; padding: 5px; color: #ffffff; text-align: center;"></div>
说每个csv文件中都有20个项目。它当前将迭代40次并在我期望它迭代400次并创建剩余项目的报告时结束。
除迭代之外的一切似乎都在起作用。有没有人想过更好的方法?
答案 0 :(得分:0)
迭代40次听起来恰到好处 - 当你遍历你的DictReader
时,你实际上是在迭代包裹的文件行,一旦你完成迭代它就不会神奇地重置到开头 - 迭代器已经完成。
这意味着您的代码将开始迭代comparator
(1)中的第一项,然后迭代reader
(20)中的所有项,然后从{获取下一行{1}}(1),然后在comparator
中没有任何东西可以迭代,所以它将转到下一个reader
行,依此类推,直到它在剩余的比较器行上循环(18) - 总共产生40个循环。
如果你真的想要遍历所有行(并且内存不是问题),你可以将它们存储为列表,然后每当你启动comparator
循环时你就得到一个新的迭代器,所以:< / p>
for..in
应该给你一个即时修复。或者,您可以在循环后使用reader = list(csv.DictReader(csvfile))
comparator = list(csv.DictReader(csvfile2))
重置reader
'蒸汽'。
话虽如此,如果你只想比较行,并且你预计不会有很多行不同,你可以加载csv.reader()中的第一行来获取'header',然后放弃{通过直接比较线条来完成{1}}。然后当有更改时,您可以在行中弹出csvfile.seek(0)
以正确解析它,然后将其映射到headers表以获取var名称。
对于大型数据集来说,这应该会明显加快,而且通过文件搜索可以为您提供永远不需要在内存中存储比当前I / O缓冲区更多数据的好处。