遍历 excel 个文件做一些事情并将它们保存到新文件夹 python pandas
loop though excel files do something and save them to new folder python pandas
我在使用 for 循环时遇到问题。
我不知道发生了什么,这曾经有效,但现在它告诉我 "No objects to concatenate"。
我想完成两件事。
我想遍历文件夹中的所有 excel 个文件。对于每个 excel 文件,我想删除 2 行 header 数据(下面的代码已经这样做了)。
然后我想将每个编辑过的文件以其原始文件名保存在一个新文件夹中。而且,保存一个新文件,其中每个编辑文件的所有数据都附加在一起。
我以为我的追加是正确的,但由于某种原因它不再工作了。
import os
import pandas as pd
import numpy as np
from pandas import Series, DataFrame
appended_data = []
path = 'C:\Test\TestRawFile'
for fn in os.listdir(path):
if os.path.isfile(fn):
# Import the excel file and call it xlsx_file
xlsx_file = pd.ExcelFile(fn)
# View the excel files sheet names
xlsx_file.sheet_names
# Load the xlsx files Data sheet as a dataframe
df = xlsx_file.parse('Sheet1',header= None)
df_NoHeader = df[2:]
data = df_NoHeader
appended_data.append(data)
appended_data = pd.concat(appended_data)
这是我目前遇到的错误。
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-46-962ccf280c0b> in <module>()
11 data = df_NoHeader
12 appended_data.append(data)
---> 13 appended_data = pd.concat(appended_data)
C:\Anaconda2\lib\site-packages\pandas\tools\merge.pyc in concat(objs, axis, join, join_axes, ignore_index, keys, levels, names, verify_integrity, copy)
832 keys=keys, levels=levels, names=names,
833 verify_integrity=verify_integrity,
--> 834 copy=copy)
835 return op.get_result()
836
C:\Anaconda2\lib\site-packages\pandas\tools\merge.pyc in __init__(self, objs, axis, join, join_axes, keys, levels, names, ignore_index, verify_integrity, copy)
865
866 if len(objs) == 0:
--> 867 raise ValueError('No objects to concatenate')
868
869 if keys is None:
ValueError: No objects to concatenate
IIUC 你可以这样做:
import os
import glob
import pandas as pd
fmask = '/path/to/excel_files_dir/*.xls*'
target_dir = '/path/to/'
target_fname = '/path/to/result.xlsx'
dfs = []
for f in glob.glob(fmask):
df = pd.read_excel(f, header=None, skiprows=2)
df.to_excel(os.path.join(target_dir, os.path.basename(f)),
index=False)
dfs.append(df)
# save concatenated
pd.concat(dfs, ignore_index=True).to_excel(target_fname, index=False)
最有可能的原因是脚本之前有效而现在无效,因为您将其位置从 Excel 文件的文件夹中移出,因为此代码使用相对路径。尝试使用绝对路径,将文件夹路径名连接到文件名。考虑使用 os.path.join()
,它甚至有助于保存到新文件夹:
dfList = []
path = 'C:\Test\TestRawFile'
newpath = 'C:\Path\To\New\Folder'
for fn in os.listdir(path):
# Absolute file path
file = os.path.join(path, fn)
if os.path.isfile(file):
# Import the excel file and call it xlsx_file
xlsx_file = pd.ExcelFile(file)
# View the excel files sheet names
xlsx_file.sheet_names
# Load the xlsx files Data sheet as a dataframe
df = xlsx_file.parse('Sheet1',header= None)
df_NoHeader = df[2:]
data = df_NoHeader
# Save individual dataframe
data.to_excel(os.path.join(newpath, fn))
dfList.append(data)
appended_data = pd.concat(dfList)
appended_data.to_excel(os.path.join(newpath, 'master_data.xlsx'))
我在使用 for 循环时遇到问题。 我不知道发生了什么,这曾经有效,但现在它告诉我 "No objects to concatenate"。
我想完成两件事。 我想遍历文件夹中的所有 excel 个文件。对于每个 excel 文件,我想删除 2 行 header 数据(下面的代码已经这样做了)。
然后我想将每个编辑过的文件以其原始文件名保存在一个新文件夹中。而且,保存一个新文件,其中每个编辑文件的所有数据都附加在一起。
我以为我的追加是正确的,但由于某种原因它不再工作了。
import os
import pandas as pd
import numpy as np
from pandas import Series, DataFrame
appended_data = []
path = 'C:\Test\TestRawFile'
for fn in os.listdir(path):
if os.path.isfile(fn):
# Import the excel file and call it xlsx_file
xlsx_file = pd.ExcelFile(fn)
# View the excel files sheet names
xlsx_file.sheet_names
# Load the xlsx files Data sheet as a dataframe
df = xlsx_file.parse('Sheet1',header= None)
df_NoHeader = df[2:]
data = df_NoHeader
appended_data.append(data)
appended_data = pd.concat(appended_data)
这是我目前遇到的错误。
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-46-962ccf280c0b> in <module>()
11 data = df_NoHeader
12 appended_data.append(data)
---> 13 appended_data = pd.concat(appended_data)
C:\Anaconda2\lib\site-packages\pandas\tools\merge.pyc in concat(objs, axis, join, join_axes, ignore_index, keys, levels, names, verify_integrity, copy)
832 keys=keys, levels=levels, names=names,
833 verify_integrity=verify_integrity,
--> 834 copy=copy)
835 return op.get_result()
836
C:\Anaconda2\lib\site-packages\pandas\tools\merge.pyc in __init__(self, objs, axis, join, join_axes, keys, levels, names, ignore_index, verify_integrity, copy)
865
866 if len(objs) == 0:
--> 867 raise ValueError('No objects to concatenate')
868
869 if keys is None:
ValueError: No objects to concatenate
IIUC 你可以这样做:
import os
import glob
import pandas as pd
fmask = '/path/to/excel_files_dir/*.xls*'
target_dir = '/path/to/'
target_fname = '/path/to/result.xlsx'
dfs = []
for f in glob.glob(fmask):
df = pd.read_excel(f, header=None, skiprows=2)
df.to_excel(os.path.join(target_dir, os.path.basename(f)),
index=False)
dfs.append(df)
# save concatenated
pd.concat(dfs, ignore_index=True).to_excel(target_fname, index=False)
最有可能的原因是脚本之前有效而现在无效,因为您将其位置从 Excel 文件的文件夹中移出,因为此代码使用相对路径。尝试使用绝对路径,将文件夹路径名连接到文件名。考虑使用 os.path.join()
,它甚至有助于保存到新文件夹:
dfList = []
path = 'C:\Test\TestRawFile'
newpath = 'C:\Path\To\New\Folder'
for fn in os.listdir(path):
# Absolute file path
file = os.path.join(path, fn)
if os.path.isfile(file):
# Import the excel file and call it xlsx_file
xlsx_file = pd.ExcelFile(file)
# View the excel files sheet names
xlsx_file.sheet_names
# Load the xlsx files Data sheet as a dataframe
df = xlsx_file.parse('Sheet1',header= None)
df_NoHeader = df[2:]
data = df_NoHeader
# Save individual dataframe
data.to_excel(os.path.join(newpath, fn))
dfList.append(data)
appended_data = pd.concat(dfList)
appended_data.to_excel(os.path.join(newpath, 'master_data.xlsx'))