Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
要将python脚本概括为三种excel格式(.xlsx)/(.xlsm)/(.xls),而无需手动操作吗_Python_Excel_If Statement - Fatal编程技术网

要将python脚本概括为三种excel格式(.xlsx)/(.xlsm)/(.xls),而无需手动操作吗

要将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

编写了将每个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 (".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”))