【问题标题】:Open CSV file and writing each row to new, dynamically named CSV file打开 CSV 文件并将每一行写入新的、动态命名的 CSV 文件
【发布时间】:2023-03-13 19:44:01
【问题描述】:

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

例如 文件 1 包含:row1、row2、 文件 2 包含:第 1 行、第 3 行、 文件 3 包含:第 1 行,第 4 行

等等。

目前正在与:

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 没有被定义?

【问题讨论】:

    标签: python csv


    【解决方案1】:

    我已经尝试过了,它可以很好地满足您的目的。不幸的是,我没有得到任何 csvfile_out error 并且您的 with 语句 在我的 Python 2.7.12 控制台中正常工作。

    import csv
    
    counter = 1
    
    with open('mock_data.csv', 'r') as csvfile:
        reader = csv.reader(csvfile)
        row1 = next(reader) # here you save your first line of the .csv file
        for row in reader:
            if row: # if row is not empty, write a file with this row
                filename = "file_%s" % str(counter)
                with open(filename, 'w') as csvfile_out:
                    writer = csv.writer(csvfile_out)
                    writer.writerow(row1) #here you write your row1 as first row of csvfile_out
                    writer.writerow(row)
                    counter = counter + 1
    

    【讨论】:

    • 谢谢你。未定义的错误是我很愚蠢。这很好,因为我绝对不认为代码有什么问题!
    • 跟进:我有一个奇怪的问题。 writer.writerow(row) 被放在第三行,中间有一个空白行。有什么想法吗?
    • 我认为如果您的“mock_data.csv”中有空白行,就会出现此问题。您必须从您的 'mock_data.csv', see here 中删除空白行,或者检查您的代码是否有一行是空白的(我将第二个选项放在我的答案中,我希望这可以解决您的问题)。
    • 原来我实际上忘记将newline='' 添加到with open(filename, 'w', newline='') as csvfile_out: - 添加删除了空白行。说实话,我不知道为什么会这样。
    【解决方案2】:

    这是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)
    

    这将根据“名称”列(即 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:如果你不想要标题,只需在调用.to_csv() 函数时添加header = None。例如:

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

    【讨论】:

      【解决方案3】:

      你也可以使用 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-17
        相关资源
        最近更新 更多