Запись 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()
Я уверен, что есть более чистый способ сделать этот код, я все еще новичок в этом, но сейчас он делает то, что я ожидаю.