在当前路径中,有多个文件夹,每个文件夹内有多个文件夹或xlsx文件,我想迭代每个文件夹并读取这些excel文件,直到没有文件夹或所有xlsx文件被读取。有50多个文件夹和2000多个excel文件。以下是我的代码:
import os
import pandas as pd
current_path=os.getcwd()
dfs = []
def process_folder(path):
for item in os.listdir(path):
item_path=os.path.join(path, item)
if os.path.isdir(item_path):
process_folder(item_path)
elif item.endswith('.xlsx'):
df = pd.read_excel(item_path)
dfs.append(df)
process_folder(current_path)
result_df = pd.concat(dfs, ignore_index=True)
result_df.to_excel('result.xlsx')
当我运行代码时,它显示错误"Excel file cannot be determined, you must specify an engine manually".所以我修改了read_excel: df = pd.read_excel(item_path, engine='openpyxl')。然后就出现了错误: "zipfile.BadZipFile: File is not a zip file"。但是我并没有读取任何zip文件。不知道为什么会出现这个错误
你的xlsx文件不是一个有效的zip文件,可能是因为它损坏了或者被修改了。你用Office创建一个新的xlsx文件,然后用Python读取它
参考一下跟你一样的错误 https://stackoverflow.com/questions/57817758/badzipfile-file-is-not-a-zip-file-error-popped-up-all-of-a-sudden
不知道你这个问题是否已经解决, 如果还没有解决的话:答案:
你遇到的zipfile.BadZipFile错误是由于某些xlsx文件被误识别为zip文件而导致的。这种情况通常发生在文件损坏或文件格式错误的情况下。
为了解决这个问题,你可以在读取xlsx文件之前,先检查一下文件的类型。可以通过使用mimetypes
模块来获取文件的MIME类型。尽管xlsx文件的MIME类型应该是"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",但我们还是可以使用这种方式来排除一些意外情况。
以下是修改后的代码示例:
import os
import pandas as pd
import mimetypes
root_path = "/path/to/root/folder"
def process_folder(folder_path):
for item in os.listdir(folder_path):
item_path = os.path.join(folder_path, item)
if os.path.isdir(item_path):
process_folder(item_path)
elif mimetypes.guess_type(item_path)[0] == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":
try:
df = pd.read_excel(item_path, engine='openpyxl')
# 在这里对df进行处理
except Exception as e:
print(f"Error reading file {item_path}: {e}")
process_folder(root_path)
在示例代码中,我们使用mimetypes.guess_type(item_path)[0]
来获取文件的MIME类型,并与预期的xlsx文件的MIME类型进行比较。如果类型匹配,我们就尝试读取文件,否则就跳过该文件并输出错误信息。
这样做可以排除掉文件类型不正确的文件,避免再次出现zipfile.BadZipFile错误并处理其他类型的文件。如果仍然存在问题,可以通过打印出异常信息来帮助进一步排查错误原因。
希望这个解决方案对你有帮助!如果还有其他问题,请随时提问。