打开CSV文件并将每一行写入新的动态命名的CSV文件

时间:2017-05-13 12:24:14

标签: python csv

我有一个带有50行数据的csv文件,我想将它分成每行的单独csv文件,其中包括第一行(标题)和相关行。

E.g。 文件1包含:row1,row2, 文件2包含:row1,row3, 文件3包含:row1,row4

等等。

目前正在使用:

import csv

counter = 1

with open('mock_data.csv', 'r', newline='') as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        filename = "file_%s" % str(counter)
        with open(filename, 'w') as csvfile_out:
            writer = csv.writer(csvfile_out)
            writer.writerow(row)
            counter = counter + 1

我目前正在定义'csvfile_out'。

a)我是否正确地接近了这一点 b)为什么没有定义csvfile_out的想法?

3 个答案:

答案 0 :(得分:1)

我试过这个,它可以很好地满足你的目的。不幸的是,我没有得到任何Kitchen:<input type="checkbox" checked data-toggle="toggle" data-onstyle="primary" data-on="On" data-off="Off"> ,而 with statement 在我的Python 2.7.12控制台中正常运行。

csvfile_out error

答案 1 :(得分:0)

以下是pandas的解决方案。假设csv的内容如下:

Name, Age, Gender
John, 20, Male
Jack, 22, Male
Jill, 18, Female

我的代码如下:

import pandas as pd
df = pd.read_csv("mock_data.csv")

for index, row in df.iterrows():
    file_name = row['Name']+".csv"  #Change the column name accordingly
    pd.DataFrame(row).T.to_csv(file_name, index=None)

这将根据列#34; Name&#34;的值创建文件名。 (即Jack,John和Jill)生成三个文件John.csvJack.csvJill.csvJohn.csv的内容如下:

Name    | Age   |  Gender |
---------------------------
John    | 20    |  Male   |

Jack.csv的内容如下:

Name    | Age   |  Gender |
---------------------------
Jack    | 22    |  Male   |

Jill.csv的内容如下:

Name    | Age   |  Gender |
---------------------------
Jill    | 20    |  Female   |

P.S: 如果您不想要标题,只需在调用header = None函数时添加.to_csv()即可。例如:

pd.DataFrame(row).T.to_csv(file_name, index=None, Header=None)

答案 2 :(得分:0)

你也可以使用DictReader ......

import csv

counter = 1

with open('mock_data.csv', 'r') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        filename = "file_%s" % str(counter)
        with open(filename, 'w') as csvfile_out:
        writer = csv.DictWriter(csvfile_out, fieldnames=reader.fieldnames)
        headers = dict((n, n) for n in reader.fieldnames)
        writer.writerow(headers)
        writer.writerow(row)
        counter = counter + 1