如何用Python选择CSV文件中的每第N行
我有一个包含数百行的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='')
。