Запись CSV-содержимого в Excel создает пустые листы

Запись DataFrame в файл Excel оставляет листы с нулевыми данными.

Я создаю роботизированное "Скаутское приложение". Он получает несколько файлов.csv в течение двух дней. Файлы CSV будут названы четырьмя цифрами плюс дефис, а затем номер совпадения. Например "2073-18.csv". Придет несколько файлов для каждой команды. Мне нужен один лист для каждой команды с содержанием каждого CSV-файла на том же листе для этой команды. Создание листов работает, запись данных на эти листы - нет.

import os
import glob
import csv
from xlsxwriter.workbook import Workbook
import pandas as pd
import numpy as np
#from sqlalchemy import create_engine
from openpyxl import load_workbook

os.chdir ("/EagleScout")
path = '.'
extension = 'csv'
engine = 'xlsxwriter'

files_in_dir = [ f for f in glob.glob('*.csv')]

workbook = Workbook('Tournament.xlsx')

with pd.ExcelWriter('Tournament.xlsx') as writer:
    for csvfile in files_in_dir:
        df = pd.read_csv(csvfile)
        fName, fExt = (os.path.splitext(csvfile))
        sName = fName.split('-')
        worksheet = workbook.get_worksheet_by_name(sName [0])

        if worksheet is None:
            worksheet = workbook.add_worksheet(sName [0]) #workseet with csv file name

        df.to_excel(writer, sheet_name = (sName[0]))

    writer.save()

workbook.close()

Мне нужна одна рабочая тетрадь с одним листом для каждой команды, до 70 команд. Каждый лист будет иметь несколько строк, по одной для каждого файла CSV, который поступил для этой команды. Вопрос в том, как заставить Pandas или другие библиотеки записать содержимое каждого CSV-файла на соответствующий лист в рабочей книге?

1 ответ

Хорошо, с помощью @ivan_pozdeev я, наконец, справился со своими проблемами. Помните, мое первоначальное желание состояло в том, чтобы создать сценарий, который можно запускать на регулярной основе, и создать электронную таблицу с несколькими таблицами. Каждый лист будет содержать все данные из файлов.csv для каждого сыгранного матча и сгруппирован по номеру команды. Я также добавил одну электронную таблицу, которая содержит необработанные данные. Вот что я придумал:

import os
import glob
import csv
import xlsxwriter
from xlsxwriter.workbook import Workbook
import pandas as pd
import numpy as np
#from sqlalchemy import create_engine
#import openpyxl
#from openpyxl import load_workbook

os.chdir ("/EagleScout")
path = '.'
extension = 'csv'


# Remove the combined .csv file from previous runs
#This will provide clean date without corruption from earlier runs
if os.path.exists('./Spreadsheets/combined.csv'): 
    os.remove ('./Spreadsheets/combined.csv')

#Remove previous Excel spreadsheet
if os.path.exists('./Spreadsheets/Tournament.xlsx'): 
    os.remove ('./Spreadsheets/Tournament.xlsx')


#Remove sorted combined csv
#Remove previous Excel spreadsheet
if os.path.exists('./Spreadsheets/Combined.xlsx'): 
    os.remove ('./Spreadsheets/Combined.xlsx')


#Read in and merge all .CSV file names
files_in_dir = [ f for f in glob.glob('*.csv')] 


#Create a single combined .csv file with all data
#from all matches completed so far.
d1 = pd.read_csv('Header.txt')
d1.to_csv('./Spreadsheets/combined.csv', header = True, index = False)

for filenames in files_in_dir: 
    df = pd.read_csv(filenames)
    fName, fExt = (os.path.splitext(filenames))
    sName = fName.split('-')
    N=(sName[1])
    df.insert(0,N,N,True)
    df.to_csv('./Spreadsheets/combined.csv', index_label = (sName[0]), mode = 'a')


#Combine all csv files into one master Raw Excel Data file
#and add column headers as labels
with pd.ExcelWriter('./Spreadsheets/Combined.xlsx') as writer:
    dt = pd.read_csv('./Spreadsheets/combined.csv')
    dt.to_excel(writer, sheet_name = 'All data')

    writer.save()



#Parse through all .CSV files and append content to appropriate team worksheet.
with pd.ExcelWriter('./Spreadsheets/Tournament.xlsx') as writer:

    df2 = pd.read_excel('./Spreadsheets/Combined.xlsx')
    group = df2.groupby('Team')
    for Team, Team_df in group:

        Team_df.to_excel(writer, sheet_name = str(Team))


    writer.save()

Я уверен, что есть более чистый способ сделать этот код, я все еще новичок в этом, но сейчас он делает то, что я ожидаю.

Другие вопросы по тегам