【问题标题】:How can I break down a large csv file into small files based on common records by pythonpython - 如何根据python的常见记录将大型csv文件分解为小文件
【发布时间】:2015-11-21 03:56:44
【问题描述】:

我想做什么:

我想要做的是我有一个大的 .csv 文件。我想根据 BB 列中 HH 列中包含 1 的常见记录以及 HH 列中包含 0 的所有不常见记录,将这个大 csv 文件分解为许多小文件。

因此,所有文件将在 BB 列中包含 HH 列中包含 1 的常见记录,以及在 BB 列中没有记录且在 HH 列中包含 0 的所有不常见记录。文件名应以第 2 列(BB)的公共记录为基础。请看下面的场景。 任何建议想法都受到高度赞赏。

大文件.csv:

   AA      BB      CC       DD     EE      FF    GG      HH
   12      53     115       10     3       3     186     1
   12      53     01e       23     3       2             1
   12      53     0ce       65     1       3             1
   12      53     173       73     4       2             1
   12      59     115       0      3       3     186     1
   12      59     125       0      3       3     186     1
   12      61     01e       23     3       2             1
   12      61     b6f       0      1       1             1
   12      61     b1b       0      6       5     960     1
   12             68b       95     3       5     334     0
   12             31a       31     2       2             0
   12             221       0      4       5             0
   12             12b       25     5       4     215     0
   12             a10       36     5       1             0      

我的预期结果文件如下:

53.csv:

   AA      BB      CC       DD     EE      FF    GG      HH
   12      53     115       10     3       3     186     1
   12      53     01e       23     3       2             1
   12      53     0ce       65     1       3             1
   12      53     173       73     4       2             1
   12             68b       95     3       5     334     0
   12             31a       31     2       2             0
   12             221       0      4       5             0
   12             12b       25     5       4     215     0
   12             a10       36     5       1             0      

59.csv:

   AA      BB      CC       DD     EE      FF    GG      HH
   12      59     115       0      3       3     186     1
   12      59     125       0      3       3     186     1
   12             68b       95     3       5     334     0
   12             31a       31     2       2             0
   12             221       0      4       5             0
   12             12b       25     5       4     215     0
   12             a10       36     5       1             0      

61.csv:

   AA      BB      CC       DD     EE      FF    GG      HH
   12      61     01e       23     3       2             1
   12      61     b6f       0      1       1             1
   12      61     b1b       0      6       5    960      1
   12             68b       95     3       5    334      0
   12             31a       31     2       2             0
   12             221       0      4       5             0
   12             12b       25     5       4    215      0
   12             a10       36     5       1             0      

【问题讨论】:

  • 那么到目前为止,您尝试过什么? Stack Overflow 不是代码编写服务。
  • 为什么第一个文件中包含 BB=33?
  • 33 是输入错误,已修改。

标签: python csv records


【解决方案1】:

对于您提供的数据,以下脚本将生成您请求的输出文件。它将对文件夹中找到的所有 CSV 文件执行此操作:

from itertools import groupby
import glob
import csv
import os

def remove_unwanted(rows):
    return [['' if col == 'NULL' else col for col in row[2:]] for row in rows]

output_folder = 'temp'  # make sure this folder exists

# Search for ALL CSV files in the current folder
for csv_filename in glob.glob('*.csv'):
    with open(csv_filename) as f_input:
        basename = os.path.splitext(os.path.basename(csv_filename))[0]      # e.g. bigfile

        csv_input = csv.reader(f_input)
        header = next(csv_input)
        # Create a list of entries with '0' in last column
        id_list = remove_unwanted(row for row in csv_input if row[7] == '0')
        f_input.seek(0)     # Go back to the start
        header = remove_unwanted([next(csv_input)])

        for k, g in groupby(csv_input, key=lambda x: x[1]):
            if k == '':
                break

            # Format an output file name in the form 'bigfile_53.csv'
            file_name = os.path.join(output_folder, '{}_{}.csv'.format(basename, k))

            with open(file_name, 'wb') as f_output:
                csv_output = csv.writer(f_output)
                csv_output.writerows(header)
                csv_output.writerows(remove_unwanted(g))
                csv_output.writerows(id_list)

这将导致在名为temp 的输出文件夹中创建文件bigfile_53.csvbigfile_59.csvbigfile_61.csv。比如bigfile_53.csv会出现如下:

包含字符串 'NULL' 的条目将被转换为空字符串,并且前两列将被删除(根据 OP 的注释)。

在 Python 2.7.9 中测试

【讨论】:

  • 更新为将输出 CSV 文件写入指定的输出文件夹。
  • 您好埃文斯,我在以下链接中发布了一个问题。你能看一下这个问题,并给我一个用 SQL 或 Python 解决问题的想法吗? stackoverflow.com/questions/42837518/…
【解决方案2】:

您应该查看 csv 模块。您可以逐行读取输入文件,并根据 BB 列对每一行进行排序。使用字典应该很容易做到这一点,字典的键是 BB 列中的值,而值是包含该行信息的列表。然后,您可以使用 csv 模块将这些列表写入 csv 文件。

【讨论】:

  • 我是 python 新手。你能给我编码示例/参考吗?谢谢。
猜你喜欢
  • 2015-11-13
  • 2022-01-12
  • 1970-01-01
  • 2019-09-23
  • 1970-01-01
  • 2013-04-08
  • 2022-01-16
  • 2019-06-14
  • 2020-03-22
相关资源
最近更新 更多