要将python脚本概括为三种excel格式(.xlsx)/(.xlsm)/(.xls),而无需手动操作吗
编写了将每个excel工作表转换为不同csv文件的代码。但问题是,我编写代码的方式只能适用于一种格式。看看这个if-else语句要将python脚本概括为三种excel格式(.xlsx)/(.xlsm)/(.xls),而无需手动操作吗,python,excel,if-statement,Python,Excel,If Statement,编写了将每个excel工作表转换为不同csv文件的代码。但问题是,我编写代码的方式只能适用于一种格式。看看这个if-else语句 if (".xlsx" in str(path_xlsx).lower()) and path_xlsx.is_file(): xlsx_files = [Path(path_xlsx)] else: xlsx_files = list(Path(path_xlsx).glob("*.xlsx")) if
if (".xlsx" in str(path_xlsx).lower()) and path_xlsx.is_file():
xlsx_files = [Path(path_xlsx)]
else:
xlsx_files = list(Path(path_xlsx).glob("*.xlsx"))
if (".xlsm" in str(path_xlsm).lower()) and path_xlsm.is_file():
xlsm_files = [Path(path_xlsm)]
else:
xlsm_files = list(Path(path_xlsm).glob("*.xlsm"))
上述当前if-else语句仅适用于.xlsx文件。但如果我想为.xlsm格式做些什么,我需要更改If-else语句
if (".xlsx" in str(path_xlsx).lower()) and path_xlsx.is_file():
xlsx_files = [Path(path_xlsx)]
else:
xlsx_files = list(Path(path_xlsx).glob("*.xlsx"))
if (".xlsm" in str(path_xlsm).lower()) and path_xlsm.is_file():
xlsm_files = [Path(path_xlsm)]
else:
xlsm_files = list(Path(path_xlsm).glob("*.xlsm"))
我们有没有办法调整/自动化这段代码,使其适用于这三种excel格式(.xls/.xlsm/.xlsx),而无需手动更改不同excel格式的代码。
from pathlib import Path
import time
import parser
import argparse
import pandas as pd
import os
import warnings
warnings.filterwarnings("ignore")
parser = argparse.ArgumentParser(description="Process some integers.")
parser.add_argument("path", help="define the directory to folder/file")
parser.add_argument("--verbose", help="display processing information")
start = time.time()
def main(path_xlsx, verbose):
if (".xlsx" in str(path_xlsx).lower()) and path_xlsx.is_file():
xlsx_files = [Path(path_xlsx)]
else:
xlsx_files = list(Path(path_xlsx).glob("*.xlsx"))
df = pd.DataFrame()
for fn in xlsx_files:
all_dfs = pd.read_excel(fn, sheet_name=None)
for sheet_name, df in all_dfs.items():
df = df.assign(DataSource=Path(fn.name))
x=os.path.splitext(fn.name)[0]
path=r'Output'
df.to_csv(os.path.join(path,f'{sheet_name}+{x}.csv'),index=False)
if __name__ == "__main__":
start = time.time()
args = parser.parse_args()
path = Path(args.path)
verbose = args.verbose
main(path, verbose) #Calling Main Function
print("Processed time:", time.time() - start) #Total Time
记住:我通过批处理脚本运行此代码,因此文件夹中的任何excel文件格式都应转换为不同的excel.csv文件。文件夹中有5到6个文件,其中有三个excel扩展名(.xlsx/.xlsm/.xls)。我不完全清楚您的问题是什么。下面将迭代所有三种类型的Excel文件。我假设
pandas
可以毫无问题地处理每种类型的转换。例如,如果您有一个文件.xlsx
和一个文件.xlsm
具有相同的工作表名称,我想它们都会转换为相同的csv
文件名,其中一个重叠另一个。如果存在这种可能性,您应该能够找到一种处理方法
from pathlib import Path
import time
import parser
import argparse
import pandas as pd
import os
import warnings
warnings.filterwarnings("ignore")
parser = argparse.ArgumentParser(description="Process some integers.")
parser.add_argument("path", help="define the directory to folder/file")
parser.add_argument("--verbose", help="display processing information")
start = time.time()
def main(path_xlsx, verbose):
if (".xlsx" in str(path_xlsx).lower()) and path_xlsx.is_file():
xlsx_files = [Path(path_xlsx)]
else:
xlsx_files = list(Path(path_xlsx).glob("*.xlsx"))
df = pd.DataFrame()
for fn in xlsx_files:
all_dfs = pd.read_excel(fn, sheet_name=None)
for sheet_name, df in all_dfs.items():
df = df.assign(DataSource=Path(fn.name))
x=os.path.splitext(fn.name)[0]
path=r'Output'
df.to_csv(os.path.join(path,f'{sheet_name}+{x}.csv'),index=False)
if __name__ == "__main__":
start = time.time()
args = parser.parse_args()
path = Path(args.path)
verbose = args.verbose
main(path, verbose) #Calling Main Function
print("Processed time:", time.time() - start) #Total Time
来自itertools导入链的
进口稀土
如果重新搜索(r“\.xls[xm]?$”、str(path_xlsx).lower())和path_xlsx.is_file():
xlsx_文件=[Path(Path_xlsx)]
其他:
xlsx_files=list(链(Path(Path_xlsx).glob(*.xls)、Path(Path_xlsx).glob(*.xlsx)、Path(Path_xlsx).glob(*.xlsm)))
注意
但是确实没有必要首先将xlsx_文件
转换为列表
,因为您将使用在xlsx_文件中的fn:
迭代链
(或原始代码中的glob
)的结果。这既浪费时间又浪费空间。因此:
来自itertools导入链的
进口稀土
如果重新搜索(r“\.xls[xm]?$”、str(path_xlsx).lower())和path_xlsx.is_file():
xlsx_文件=[Path(Path_xlsx)]
其他:
xlsx_files=chain(Path(Path_xlsx).glob(“*.xls”)、Path(Path_xlsx).glob(“*.xlsx”)、Path(Path_xlsx).glob(“*.xlsm”))