Я пытаюсь объединить несколько файлов CSV в лист Excel, чтобы иметь возможность анализировать свои данные.
До сих пор мне удавалось создать рабочий лист с именами файлов CSV в качестве вкладок, но на самих листах я не могу получить нужные данные.
Я использую read.csv из pandas, но, судя по тому, что я вижу и могу работать, синтаксис дает мне только возможность прочитать данные одного CSV-файла, а затем копирует эти данные на все вкладки, которые это не то, что я хочу.
import pandas as pd
import os
os.chdir('C:/Users/user3482176/correct_document_location)
csv_files = ['doc1.csv', 'doc2.csv', 'doc3.csv']
reading = pd.read_csv('C:/Users/user3482176/correct_document_location/doc1.csv')
with pd.ExcelWriter('combined_csv_files.xlsx', engine='openpyxl') as writer:
for csv_file in csv_files:
sheet_name = csv_file.split('.')[0]
df.to_excel(writer,sheet_name=sheet_name, index=False)
if_sheet_exists:'overlay'
Я видел, что вы можете использовать пакет glob для получения файлов csv, а затем отображать данные с его помощью, но я получаю ошибку массива. Я считаю, что это связано с тем, что мои данные содержат столбцы разных размеров, какими они и должны быть, поэтому не знаю, как это обойти.
import pandas as pd
import os
import glob
os.chdir('C:/Users/user3482176/correct_document_location)
csv_files = ['doc1.csv', 'doc2.csv', 'doc3.csv']
xlsx_files = glob.glob(os.path.join(directory_path, '*.csv'))
df_list = [pd.read_csv(file) for file in xlsx_files]
combined_df = pd.concat(df_list,join='outer', ignore_index=True)
df = pd.DataFrame(df_list)
with pd.ExcelWriter('combined_csv_files.xlsx', engine='openpyxl') as writer:
for csv_file in csv_files:
sheet_name = csv_file.split('.')[0]
df.to_excel(writer,sheet_name=sheet_name, index=False)
if_sheet_exists:'overlay'
Traceback (most recent call last): File "C:\Users\user3482176\PycharmProjects\combination_worksheet\collating sheets.py", line 53, in <module> df = pd.DataFrame(df_list) File "C:\Users\user3482176\PycharmProjects\combination_worksheet\venv\lib\site-packages\pandas\core\frame.py", line 867, in __init__ mgr = ndarray_to_mgr( File "C:\Users\user3482176\PycharmProjects\combination_worksheet\venv\lib\site-packages\pandas\core\internals\construction.py", line 319, in ndarray_to_mgr values = _prep_ndarraylike(values, copy=copy_on_sanitize) File "C:\Users\user3482176\PycharmProjects\combination_worksheet\venv\lib\site-packages\pandas\core\internals\construction.py", line 575, in _prep_ndarraylike values = np.array([convert(v) for v in values]) ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (39,) + inhomogeneous part.
Я пытаюсь понять, как обойти эту ошибку, чтобы поместить несколько файлов CSV в 1 лист Excel.
Не уверен насчет вашего рабочего процесса, но рассматривали ли вы вариант Импортировать данные из папки с несколькими файлами (Power Query) — Служба поддержки Microsoft?
У меня это работает так:
import pandas as pd
import os
csv_files = ['doc1.csv', 'doc2.csv']
excel_writer = pd.ExcelWriter('output.xlsx', engine='xlsxwriter')
for csv_file in csv_files:
df = pd.read_csv(csv_file)
sheet_name = os.path.splitext(os.path.basename(csv_file))[0]
df.to_excel(excel_writer, sheet_name=sheet_name, index=False)
excel_writer.close()
Вы можете переключить двигатель xlsxwriter
с помощью openpyxl
При этом создается файл Excel с листом для каждого файла .csv.
Привет, Адриан, спасибо, что заглянул! У меня это сработало, мне просто нужно было изменить имена некоторых файлов CSV, чтобы они были <31 символа. Можете ли вы объяснить, почему мой код не работал, похоже, я пошел более сложным путем, чем вы.
@user3482176 user3482176 конечно, я могу попробовать. Прежде всего, я не понимаю, откуда берется ваша переменная Directory_path, но я думаю, что это то же самое, что вы ввели для изменения рабочего каталога. Так что пока скомбинированный_df все в порядке. С помощью pd.concat() вы создали один огромный DataFrame, объединив их вместе, как описано здесь в этом нет необходимости. Затем вы пытаетесь создать один фрейм данных со списком фреймов данных разного размера. Это создает вашу ошибку, поскольку это недопустимый способ создания объекта DataFrame.
По сути, вам нужно было изменить свой код, это удалить строки, в которых вы назначаете combined_df
и df
. И затем не создавайте df_list
, вместо этого создайте df из csv в цикле for, чтобы вы могли легко получить доступ к имени файла для имени листа.
Excel может открывать файлы CSV напрямую. Если вы хотите, чтобы все это было на одном листе, просто скопируйте весь файл в один и откройте его.
copy doc1.csv+doc2.csv+doc3.csv result.csv
иstart result.csv
.