如何用Python选择CSV文件中的每第N行

3 投票
3 回答
6405 浏览
提问于 2025-04-30 22:07

我有一个包含数百行的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

我想选出前面三行,然后导出到一个名为“1980 10 12”的新CSV文件,这个名字是根据第一行来的。接着再选出接下来的三行,导出到一个名为“1981 10 12”的新CSV文件,这个名字也是根据下一组三行的第一行来命名。我想用Python来实现这个功能。

暂无标签

3 个回答

0

使用一些小技巧来处理迭代器:

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)

在 Python 2.X 中,你可以使用 itertools.izip。文档中实际上提到过 izip(*[iter(s)]*n) 这个写法,用来把一系列数据分组。

2
import csv
with open("in.csv") as f:
    reader = csv.reader(f)
    chunks = []
    for ind, row in enumerate(reader, 1):
        chunks.append(row)
        if ind % 3 == 0: # if we have three new rows, create a file using the first row as the name
            with open("{}.csv".format(chunks[0][0].strip(), "w") as f1:
                wr = csv.writer(f1) 
                wr.writerows(chunks) # write all rows
            chunks = [] # reset chunks to an empty list

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

3

这里介绍了如何使用csv模块,再加上itertools.islice()来每次选择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))这一行的意思是,从读取器中拿出接下来的2行数据,然后把它们复制到写入的CSV文件中。在这之前,当前的行(包含日期)会先写入输出文件。

你可能需要调整一下csv.reader()csv.writer()中的delimiter参数;默认是用逗号分隔,但你没有说明具体的格式,可能需要把它设置为'\t',也就是制表符。

如果你使用的是Python 3,打开文件时要用'r''w'的文本模式,并且两个文件都要设置newline='';也就是要这样打开:open(inputfilename, 'r', newline='')open(filename, 'w', newline='')

撰写回答