<p>最好不要在代码中硬编码事件号,这样它就不依赖于数据的值。我还喜欢使用<code>csv</code>模块,该模块已经过优化,可以读写.csv文件。在</p>
<p>有一种方法可以做到:</p>
<pre><code>import csv
prefix = 'events' # of output csv file names
data = {}
with open('conditions.csv', 'rb') as conditions:
reader = csv.reader(conditions)
for row in reader:
data.setdefault(row[0], []).append(row)
for event in sorted(data):
csv_filename = '{}_{}.csv'.format(prefix, event)
print(csv_filename)
with open(csv_filename, 'wb') as csvfile:
writer = csv.writer(csvfile)
writer.writerows(data[event])
</code></pre>
<p><strong>更新</strong></p>
<p>上面实现的方法首先将整个csv文件读入内存,然后将与每个事件值关联的所有行写入一个单独的输出文件,一次一个。在</p>
<p>一种更节省内存的方法是同时打开多个输出文件,并在将每一行读到正确的目标文件后立即将其写入。这样做需要跟踪哪些文件已经打开。文件管理代码需要做的其他事情是确保在处理完成时关闭所有文件。在</p>
<p>在下面的代码中,所有这些都是通过定义并使用Python<a href="https://docs.python.org/2/library/stdtypes.html#context-manager-types" rel="nofollow noreferrer"><em>Context Manager</em></a>类型来集中处理可能生成的所有csv输出文件,这些输出文件取决于输入文件中有多少不同的事件值。在</p>
^{pr2}$
<p>下面是如何使用它:</p>
<pre><code>prefix = 'events' # to name of each csv output file
with open('conditions.csv', 'rb') as conditions:
reader = csv.reader(conditions)
with MultiCSVOutputFileManager() as file_manager:
for row in reader:
csv_filename = '{}_{}.csv'.format(prefix, row[0]) # row[0] is event
writer = file_manager.get_csv_writer(csv_filename)
writer.writerow(row)
</code></pre>