如何使用python选择CSV文件中的每N行

如何使用python选择CSV文件中的每N行,python,csv,Python,Csv,我有一个包含数百行的CSV文件,我想每3行选择并导出一个新的CSV文件,新的输出CSV文件以选择的第一行命名 例如,在以下CSV文件中 1980 10 12 1 2 3 4 5 6 7 4 6 8 1 0 8 6 1981 10 12 2 4 9 7 5 4 1 8 9 3 8 3 7 3 我想选择前3行并基于第一行导出为名为“1980 10 12”的新CSV,然后选择下3行并基于下3行的第一行导出为

我有一个包含数百行的CSV文件,我想每3行选择并导出一个新的CSV文件,新的输出CSV文件以选择的第一行命名

例如,在以下CSV文件中

1980 10 12            
1  2  3  4  5  6  7       
4  6  8  1  0  8  6  
1981 10 12
2  4  9  7  5  4  1  
8  9  3  8  3  7  3
我想选择前3行并基于第一行导出为名为“1980 10 12”的新CSV,然后选择下3行并基于下3行的第一行导出为名为“1981 10 12”的新CSV。我想使用python完成此操作。

使用,加上每次选择3行:

import csv
import os.path
from itertools import islice


with open(inputfilename, 'rb') as infh:
    reader = csv.reader(infh)
    for row in reader:
        filename = row[0].replace(' ', '_') + '.csv')
        filename = os.path.join(directory, filename)
        with open(filename, 'wb') as outfh:
            writer = csv.writer(outfh)
            writer.writerow(row)
            writer.writerows(islice(reader, 2))
writer.writerows(islice(reader,2))
行首先将当前行(带日期)写入输出文件后,从读取器获取接下来的两行,将它们复制到writer CSV

您可能需要调整
csv.reader()
csv.writer()
对象的
delimiter
参数;默认值是逗号,但您没有指定确切的格式,可能需要将其设置为
'\t'
选项卡


如果您使用的是Python 3,请使用
'r'
'w'
文本模式打开文件,并为这两种模式设置
换行符=''
<代码>打开(输入文件名'r',换行符='')和
打开(文件名'w',换行符='')
使用轻微的迭代器技巧:

with open('in.csv', 'r') as infh:
    for block in zip(*[infh]*3):
        filename = block[0].strip() + '.csv'
        with open(filename, 'w') as outfh:
            outfh.writelines(block)

在Python2.X上,可以使用
itertools.izip
。实际提到的是
izip(*[iter(s)]*n)
作为一个数据系列集群的习惯用法。

请展示您解决问题的尝试,并解释为什么它不起作用。CSV的格式是否使用
作为分隔符?它是否由两个空格分隔???祝贺300k Martijn!:)@MartijnPieters,除了我的输出CSV文件只包含第一行的第一列之外,该代码工作得非常好。例如,对于第一组数据,我的输出文件是“1980.csv”,第二组数据是“1981.csv”,我希望根据第一行的前3列将第一组数据命名为“19801012.csv”。我该如何改变这一点?非常感谢您的帮助。@KoolKid:如果日期分布在3列上,只需将它们连接在一起<代码>文件名=“”。join(行[:3]+'.csv'将取前3列,将它们合并成一个字符串,并附加
.csv
扩展名。@MartijnPieters,那么文件名代码看起来会是这样的……文件名=行[0]。join(行[:3])+'.csv',因为当我这样做时,我会得到第一组值的输出文件名…1980198010198012。csv@KoolKid:否,您想使用空字符串
'
作为加入者。我之前的评论缺少结束语
,对此表示抱歉。更正代码:
filename=''.join(row[:3])+'.csv'
当您可以使用
enumerate()
时,为什么要使用单独的计数器?@MartijnPieters,我如何将enumerate重置为0?您可以使用
%
模运算符。@MartijnPieters,是的。我本来打算这么做的,但出于某种原因,我认为数学会让我稍后明白,这是一个漫长的星期
with open('in.csv', 'r') as infh:
    for block in zip(*[infh]*3):
        filename = block[0].strip() + '.csv'
        with open(filename, 'w') as outfh:
            outfh.writelines(block)