Как я могу разбить большой файл csv на небольшие файлы на основе общих записей python

Что я хочу сделать:

Что я хочу сделать, так это то, что у меня есть большой файл .csv. Я хочу разбить этот большой CSV-файл на множество небольших файлов на основе общих записей в столбце BB, которые также содержат 1 в столбце HH, и всех необычных записей, содержащих 0 в столбце HH.

As a result, all files will contain common records in BB column that contain 1 in the HH column, and all uncommon records that has no records in BB column and contain 0 in the HH column. The file name should be based on the common record of column 2 (BB). Please take a look below for the scenarion. Any suggestion idea is appreciated highly.

bigFile.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      

person Hasi    schedule 21.11.2015    source источник
comment
Итак, что вы пробовали до сих пор? Stack Overflow не является службой написания кода.   -  person MattDMo    schedule 21.11.2015
comment
Почему BB=33 включен в первый файл?   -  person 7stud    schedule 21.11.2015
comment
33 была опечатка и исправлена.   -  person Hasi    schedule 21.11.2015


Ответы (2)


Для предоставленных вами данных следующий скрипт создаст запрошенные вами выходные файлы. Он выполнит эту операцию для ВСЕХ файлов 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)

В результате файлы bigfile_53.csv, bigfile_59.csv и bigfile_61.csv будут созданы в выходной папке с именем temp. Например, bigfile_53.csv будет выглядеть следующим образом:

введите здесь описание изображения

Записи, содержащие строку «NULL», будут преобразованы в пустую строку, а первые два столбца будут удалены (согласно комментарию OP).

Протестировано в Python 2.7.9

person Martin Evans    schedule 23.11.2015
comment
Обновлено для записи выходных CSV-файлов в указанную выходную папку. - person Martin Evans; 24.11.2015
comment
Привет Эванс, я разместил проблему в следующей ссылке. Не могли бы вы взглянуть на проблему и дать мне идею решить проблему с помощью SQL или Python? stackoverflow.com/ вопросы/42837518/ - person Hasi; 16.03.2017

Вы должны изучить модуль csv. Вы можете читать входной файл построчно и сортировать каждую строку по столбцу BB. Это должно быть легко сделать со словарем, чьи ключи являются значением в столбце BB, а значения представляют собой список, содержащий информацию из этой строки. Затем вы можете записать эти списки в файлы csv с помощью модуля csv.

person dmh    schedule 21.11.2015
comment
Я новичок в питоне. Не могли бы вы дать мне образец кодирования / ссылку? Спасибо. - person Hasi; 21.11.2015