2017-07-11 75 views
1

我在形式创建多个Excel文件多张

col1, col2, col3, col4... 
a, x, y, z 
a, x, y, z 
b, x, y, z 
b, x, y, z 
.. .. .. .. 

主CSV文件,我想读这个文件中创建一个新的Excel的所有值文件的形式COL1 ==一和另一个具有所有值的文件,其中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()一行一行地使用条件来确定应该追加哪个文件,还是应该在行后附加一个字符串,然后在每个文件末尾写入每个文件。还是有一个模块来优化这样的过程?

+1

哪种方法最适合您的标准是什么?听起来像所有这些都是合理的方法,这使得这完全是一种意见。 –

+0

这,以及你实际上并未尝试实施任何方法足以遇到任何具体问题...... –

+0

@MadPhysicist我将在大型数据集上实现这一点,不知道这些方法是否会速度太慢或内存效率低下。 – alexjones

回答

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模块。如果你想应用更复杂的处理,你当然可以考虑添加它。

2

我建议尝试pandas这种东西。写入excel有一个特殊功能。在这种情况下,想象我看了你的.csv文件变成熊猫数据帧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') 

希望有帮助。

+0

这应该是非常有用的,谢谢。 – alexjones