我有一个主要的csv文件,格式为
col1, col2, col3, col4...
a, x, y, z
a, x, y, z
b, x, y, z
b, x, y, z
.. .. .. ..
我想阅读此文件。创建一个新的Excel文件,其中包含 col1 == a 的所有值和另一个包含 col1 == b 所有值的文件。所以 OutputFilea 将如下所示:
col1, col2, col3, col4...
a, x, y, z
a, x, y, z
和 OutputFileb 看起来像
col1, col2, col3, col4...
b, x, y, z
b, x, y, z
我的问题是,我应该逐行使用 csv.reader()并使用条件来确定应该追加哪个文件,或者我应该追加带有行的字符串然后写入每个文件结束。或者是否有一个模块来优化这样的过程?
答案 0 :(得分:3)
由于您将使用大型数据集,因此最好不要同时在内存中保留太多内容。您可以维护由行前缀键入的打开文件的字典,并确保使用contextlib.ExitStack
正确关闭文件。这样做可以让您在处理输入电子表格时懒洋洋地打开新文件:
from contextlib import ExitStack
output_files = {}
with open('master.csv', 'r') as master, ExitStack() as output_stack:
for line in master:
prefix = line.split(',', 1)[0]
if prefix not in output_files:
output_name = 'output' + prefix + '.csv'
output = output_stack.enter_context(open(output_name, 'w'))
output_files[prefix] = output
else:
output = output_files[prefix]
print(line, file=output)
鉴于您希望将行按原样复制到输出文件中,我选择不使用csv
模块。如果您想应用更复杂的处理,您当然应该考虑添加它。
答案 1 :(得分:2)
我建议尝试pandas这类东西。有一个特殊的功能可以写入excel。在这种情况下,想象一下我将.csv文件读入pandas数据帧df
:
In [4]: df = pd.read_csv('yourfile.csv')
In [5]: df
Out[5]:
col1 col2 col3 col4
0 a x y z
1 a x y z
2 b x y z
3 b x y z
然后我只能选择我要过滤的值并保存到excel:
In [6]: dfa = df[df['col1']=='a']
In [7]: dfa
Out[7]:
col1 col2 col3 col4
0 a x y z
1 a x y z
In [8]: dfa.to_excel('OutputFilea.xls')
第二个过滤器也是如此:
In [9]: dfb = df[df['col1']=='b']
In [10]: dfb.to_excel('OutputFileb.xls')
希望有所帮助。