我的文件夹中有一些文件。大多数但不是全部采用excel格式。文件名都是这样的:
doe_jane1234_question_12345_123456_JaneDoe.xlsx doe_john6578_question_56789_567890_JohnDoe.xlsx
我想使用Python打开每个excel文件,抓取第一张工作表,然后将其粘贴到新的excel文件中,然后在新文件中将新创建的工作表重命名为
doe_jane
doe_john
新的Excel文件将包含多个工作表,每个工作表对应于从中复制工作表的文件。
到目前为止,这是我想出的代码:首先,我在目录中创建一个空的excel文件,称为output.xlsx。
import pandas as pd
import os
import re
cwd = os.path.join("C:\\directory")
files = os.listdir(cwd)
outputpath = os.path.join(cwd, 'output.xlsx')
for i in files:
# sheet name is the string before the firs number
sheetname = re.search(r'^[^\d]*', i)
input_file_path = os.path.join(cwd,i)
df_in = pd.read_excel(input_file_path )
with pd.ExcelWriter(outputpath , engine="openpyxl", mode='a') as writer:
df_in.to_excel(writer, sheet_name=sheetname)
当我运行这个我得到一个错误:
File "C:\Anaconda3\lib\site-packages\openpyxl\workbook\child.py", line 90, in title
m = INVALID_TITLE_REGEX.search(value)
TypeError: expected string or bytes-like object
您的代码中存在一个简单的问题,导致该代码无法正常工作。问题是您没有将字符串作为的输出re.search
。而是从类返回一个对象re.Match
(该对象不能解释为工作表名称)。看到:
re_output = re.search(r'^[^\d]*', 'doe_john6578_question_56789_567890_JohnDoe.xlsx')
print(re_output)
# <re.Match object; span=(0, 8), match='doe_john'>
我们需要使用.group()
来获得匹配:
print(re_output.group())
# doe_john
因此,将线路从更改sheetname = re.search(r'^[^\d]*', i)
为sheetname = re.search(r'^[^\d]*', i).group()
应该可行。
就是说,一旦创建一个空的excel文件(带有一个空的工作表),并且该文件位于同一文件夹中,您将获得第一张excel文件的工作表,最终将得到两个空的工作表。您可以根据需要创建文件来避免这种情况。看一下下面的代码:
import pandas as pd
import os
import re
cwd = os.path.join("C:\\directory")
files = os.listdir(cwd)
outputpath = os.path.join(cwd, 'output.xlsx')
with pd.ExcelWriter(outputpath) as writer:
for file in files:
sheetname = re.search(r'^[^\d]*', file).group()
input_file_path = os.path.join(cwd, file)
pd.read_excel(input_file_path).to_excel(writer, sheet_name=sheetname)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句