Проблема с заголовками при разделении файла CSV [Python 3] - PullRequest
0 голосов
/ 12 ноября 2018

Я новичок здесь, в StackOverflow, так что, если вы допустили какие-либо формальные ошибки в этом сообщении, поправьте меня, пожалуйста, будем благодарны! Однако вернемся к основной теме: у меня есть некоторые проблемы с заголовками, когда я разбиваю большой CSV-файл на более мелкие. Общая идея состоит в том, чтобы разделить указанный файл по столбцу 1 и создать файлы меньшего размера с именами столбцов, например:

Fruit       Country       Color
apple       Poland        red
banana      Argentina     yellow
pineapple   Argentina     brown
pear        Poland        green
melon       Turkey        yellow
plum        Poland        violet
peach       Turkey        orange
grenade     Argentina     violet

Код должен генерировать 3 разных файла (Poland.csv, Turkey.csv, Argentina.csv)

Пока что я создал приведенный ниже код, который правильно разделяет CSV, но не может правильно добавлять заголовки (они добавляются через каждую итерацию). У вас есть идеи, как с этим справиться?

import csv

opener = open('file.csv', 'r', encoding='utf-8')  
csvreader = csv.reader(opener, delimiter=';')        
header = next(csvreader)

def splitter(u):                                   
    for row in u:
        with open(row[1] + '.csv', 'a', encoding='utf-8', newline='') as myfile:
          writer = csv.writer(myfile, delimiter=';', quotechar='|', quoting=csv.QUOTE_MINIMAL)
          writer.writerow(header)
          writer.writerow(row)

    myfile.close()

splitter(csvreader)

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Это решает проблему:

import csv

opener = open('file.csv', 'r', encoding='utf-8')  
csvreader = csv.reader(opener, delimiter=';')        
header = next(csvreader)

def splitter(u):
    tableNames = []
    for row in u:
        with open(row[1] + '.csv', 'a', encoding='utf-8', newline='') as myfile:
            writer = csv.writer(myfile, delimiter=';', quotechar='|', quoting=csv.QUOTE_MINIMAL)
            if not row[1] in tableNames:
                writer.writerow(header)
                tableNames.append(row[1])
            writer.writerow(row)

    myfile.close()

splitter(csvreader)
0 голосов
/ 12 ноября 2018

Попробуйте что-то вроде этого (быстро и грязно, но должно работать):

def splitter(u):    
    filenames_already_opened = []     # Just keep a list of the csv's you've already created and therefore have added a header to.           
    for row in u:
        filename = row[1] + '.csv'
        with open(filename, 'a', encoding='utf-8', newline='') as myfile:
            writer = csv.writer(myfile, delimiter=';', quotechar='|', quoting=csv.QUOTE_MINIMAL)
            if filename in filenames_already_opened:  # Don't add a header if it's already got one.
                pass
            else:
                writer.writerow(header)
                filenames_already_opened.append(filename)
            writer.writerow(row)

    myfile.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...