读取和格式化CSV文件(新行插入)

时间:2014-02-14 15:58:53

标签: python csv

我有一个CSV文件,每行包含大量数据点,尽管属于同一列。类似的东西:

A, B, C, X, Y, Z

现在,我想要做的是重新格式化文件,使得生成的CSV为:

A, B, C
X, Y, Z

我不太确定怎么去做/以pythonic的方式表达它。一个想法(我不知道如何编码)是创建一个类似于

的for循环
For elements in file:
   new_csv = []
   counter = 0
   max_counter = 3

   ##I'm using english because I dont know how to express it in python syntax
   take first element in CSV and add 1 to counter
   append first element to new_csv
   is counter < max_counter?
       if yes: go to next element
       if no: append /n to new csv then go to next element

这可能是一种可怕的方式,但我正在努力寻找另一种方式。我如何用python语法表达这个?有什么想法吗?

3 个答案:

答案 0 :(得分:3)

只需将两行写入输出csv.writer() object

with open(inputfilename, 'rb') as infh, open(outputfilename, 'wb') as outfh:
    reader = csv.reader(infh)
    writer = csv.writer(outfh)

    for row in reader:
        writer.writerows([row[:3], row[3:]])

csv.reader()对象产生的每一行都是一个列表对象,所以我们所要做的就是使用Python slice notation来切割前3个元素的新列表对象,并使用另一个列表对象其余3个要素。

答案 1 :(得分:1)

您可以使用python的CSV module

示例:

#!/usr/bin/env python
import csv

with open("input.csv", "r") as input_file, open("output.csv", "w+"):
    input_csv, output_csv = csv.reader(input_file), csv.writer(output_file);
    for row in input_csv:
        output_csv.writerows([row[:len(row)/2],row[len(row)/2]]);

给出了输入

a,b,c,d,e,f
A,B,C,D,E,F,G
1,2,3,4,5,6

将输出

a,b,c
d,e,f
A,B,C
D,E,F,G
1,2,3
4,5,6

答案 2 :(得分:0)

此解决方案适用于Python 3.对于Python 2,请参阅Martijn Pieters's answer(文件打开方式不同)。

Python有一个模块到readwrite csv文件。官方文档中有一些关于如何使用它们的nice examples。 (注意输出文件的newline="",这使得csv模块可以处理行返回,根据规范应该\r\n\n用于单元格中的换行。 )

在阅读时,您可以使用slicing拆分行并输入编写器中的部分。

import csv

# with ensures files are closed when leaving block
with open("in.csv", "r") as fin, open("out.csv", "w", newline="") as fout:
    reader = csv.reader(fin, delimiter=",")
    writer =csv.writer(fout, delimiter=",", quotechar='"', quoting=csv.QUOTE_MINIMAL)
    # Rows are each line of the csv returned as a list
    for row in reader:
        # Separate the row:
        # from beginning to 3rd element, and from 3rd element to end
        writer.writerows((row[:3], row[3:])