欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

python把 xlsx 批量生成 csv 通义 chatgpt 有大用 有大大用

见下面红色的字

要将一个文件夹下的所有 .xlsx 文件批量转换为 .csv 文件,你可以使用 pandas 库来处理这些 Excel 文件,并将其保存为 CSV 格式。此外,你还需要使用 Python 的内置模块 osglob 来遍历指定文件夹中的所有 .xlsx 文件。

首先,请确保你已经安装了 pandas 和 openpyxl(用于读取 xlsx 文件)库。如果没有安装,可以通过 pip 安装:

bash
深色版本
pip install pandas openpyxl

然后,可以使用以下代码来进行批量转换:

python
深色版本
import os
import pandas as pd

# 指定包含 .xlsx 文件的文件夹路径
folder_path = 'path/to/your/folder'

# 遍历文件夹中的所有文件
for file_name in os.listdir(folder_path):
    # 检查文件是否为 .xlsx 文件
    if file_name.endswith('.xlsx'):
        # 构造完整的文件路径
        file_path = os.path.join(folder_path, file_name)
        
        # 读取 Excel 文件
        excel_data = pd.read_excel(file_path)
        
        # 构造新的 CSV 文件名
        csv_file_name = file_name.replace('.xlsx', '.csv')
        csv_file_path = os.path.join(folder_path, csv_file_name)
        
        # 将数据保存为 CSV 文件
        excel_data.to_csv(csv_file_path, index=False)

print("转换完成")

这段代码会遍历给定文件夹中的所有文件,对于每个以 .xlsx 结尾的文件,它都会读取文件内容,并将它们保存为同名但扩展名为 .csv 的文件。请注意,这个脚本假设所有的 .xlsx 文件只有一个工作表;如果有多个工作表,你需要根据需要调整代码来处理每一个工作表。

如果你想要处理更复杂的情况,例如文件夹中还有子文件夹,或者你想只处理特定的工作表,那么你可能需要对上述代码进行相应的修改。

代码模式
但是 xlsx 有同个 sheet

如果所有的 .xlsx 文件中都有相同的 sheet 名称,并且你希望将每个文件的这个特定 sheet 转换为 .csv 文件,那么可以在读取 Excel 文件时指定 sheet 名称。下面是一个修改后的例子,它会针对每个 .xlsx 文件中的特定 sheet 进行操作:

python
深色版本
import os
import pandas as pd

# 指定包含 .xlsx 文件的文件夹路径
folder_path = 'path/to/your/folder'

# 指定要转换的 sheet 名称
sheet_name = 'Sheet1'  # 将 'Sheet1' 替换为你的 sheet 名称

# 遍历文件夹中的所有文件
for file_name in os.listdir(folder_path):
    # 检查文件是否为 .xlsx 文件
    if file_name.endswith('.xlsx'):
        # 构造完整的文件路径
        file_path = os.path.join(folder_path, file_name)
        
        try:
            # 读取 Excel 文件的指定 sheet
            excel_data = pd.read_excel(file_path, sheet_name=sheet_name)
            
            # 构造新的 CSV 文件名
            csv_file_name = file_name.replace('.xlsx', '.csv')
            csv_file_path = os.path.join(folder_path, csv_file_name)
            
            # 将数据保存为 CSV 文件
            excel_data.to_csv(csv_file_path, index=False)
            print(f"成功转换: {file_name}")
        except Exception as e:
            print(f"转换失败: {file_name}, 错误信息: {e}")

print("转换过程结束")

这段代码与之前的版本相似,但增加了对特定 sheet 的处理。如果你不确定 sheet 名称是什么,可以先用 pd.ExcelFile 来列出所有可用的 sheet 名称:

python
深色版本
excel_file = pd.ExcelFile(file_path)
print(excel_file.sheet_names)  # 打印出所有 sheet 名称

这样可以帮助你确认需要使用的 sheet 名称。

如果你有多个 sheet 并且想要将每个 sheet 分别保存为单独的 CSV 文件,你可以这样做:

python
深色版本
# 对于每个 .xlsx 文件中的每一个 sheet,生成一个对应的 .csv 文件
for file_name in os.listdir(folder_path):
    if file_name.endswith('.xlsx'):
        file_path = os.path.join(folder_path, file_name)
        
        try:
            # 读取 Excel 文件并获取所有 sheet 名称
            excel_file = pd.ExcelFile(file_path)
            for sheet in excel_file.sheet_names:
                # 读取当前 sheet 的数据
                excel_data = pd.read_excel(excel_file, sheet_name=sheet)
                
                # 构造新的 CSV 文件名,包含原始文件名和 sheet 名称
                base_name = os.path.splitext(file_name)[0]
                csv_file_name = f"{base_name}_{sheet}.csv"
                csv_file_path = os.path.join(folder_path, csv_file_name)
                
                # 将数据保存为 CSV 文件
                excel_data.to_csv(csv_file_path, index=False)
                print(f"成功转换: {file_name} 中的 sheet '{sheet}'")
        except Exception as e:
            print(f"转换失败: {file_name}, 错误信息: {e}")

print("多 sheet 文件的转换过程结束")

这段代码将会遍历每个 .xlsx 文件的所有 sheet,并为每个 sheet 创建一个独立的 .csv 文件,文件名为原文件名加上 sheet 名称。

代码模式
但是 xlsx 有几个 sheet

如果 .xlsx 文件中有多个 sheet,并且你希望将每个 sheet 转换为单独的 .csv 文件,那么你可以遍历每个文件中的所有 sheet,并分别为它们创建一个 .csv 文件。下面是一个示例代码,展示了如何实现这一点:

python
深色版本
import os
import pandas as pd

# 指定包含 .xlsx 文件的文件夹路径
folder_path = 'path/to/your/folder'

# 遍历文件夹中的所有文件
for file_name in os.listdir(folder_path):
    # 检查文件是否为 .xlsx 文件
    if file_name.endswith('.xlsx'):
        # 构造完整的文件路径
        file_path = os.path.join(folder_path, file_name)
        
        try:
            # 使用 pd.ExcelFile 来读取 Excel 文件并获取所有 sheet 名称
            excel_file = pd.ExcelFile(file_path)
            
            # 对于每个 sheet,生成一个对应的 .csv 文件
            for sheet in excel_file.sheet_names:
                # 读取当前 sheet 的数据
                excel_data = pd.read_excel(excel_file, sheet_name=sheet)
                
                # 构造新的 CSV 文件名,包含原始文件名(不带扩展)和 sheet 名称
                base_name = os.path.splitext(file_name)[0]
                csv_file_name = f"{base_name}_{sheet}.csv"
                csv_file_path = os.path.join(folder_path, csv_file_name)
                
                # 将数据保存为 CSV 文件
                excel_data.to_csv(csv_file_path, index=False)
                print(f"成功转换: {file_name} 中的 sheet '{sheet}'")
        except Exception as e:
            print(f"转换失败: {file_name}, 错误信息: {e}")

print("多 sheet 文件的批量转换完成")

这段代码会做以下事情:

  1. 它会遍历指定文件夹中的所有文件。

  2. 对于每个以 .xlsx 结尾的文件,它会使用 pd.ExcelFile 读取文件,并获取所有可用的 sheet 名称。

  3. 然后,对于每个 sheet,它会读取数据并构造一个新的 .csv 文件名,这个文件名基于原始的 .xlsx 文件名加上具体的 sheet 名称。

  4. 最后,它会将每个 sheet 的内容保存为一个独立的 .csv 文件。

这种方法确保了即使一个 Excel 文件中包含多个 sheet,每个 sheet 的数据也会被正确地转换并保存到各自的 CSV 文件中。如果你有进一步的需求或限制条件,请告知以便提供更详细的帮助。

代码模式
但是转换后为乱码

最终代码 xlsx 转为 csv

如果转换后的 CSV 文件出现乱码,这通常是由于编码问题引起的。Excel 文件中的文本可能使用了特定的编码(如 UTF-8、GBK 等),而在保存为 CSV 文件时,默认的编码可能与之不匹配,导致乱码现象。

要解决这个问题,你可以显式地指定编码格式。对于中文环境,通常使用 utf-8 或者 gbk 编码。下面是一个改进后的代码示例,它在保存 CSV 文件时指定了编码:

python
深色版本
import os
import pandas as pd

# 指定包含 .xlsx 文件的文件夹路径
folder_path = 'path/to/your/folder'

# 遍历文件夹中的所有文件
for file_name in os.listdir(folder_path):
    # 检查文件是否为 .xlsx 文件
    if file_name.endswith('.xlsx'):
        # 构造完整的文件路径
        file_path = os.path.join(folder_path, file_name)
        
        try:
            # 使用 pd.ExcelFile 来读取 Excel 文件并获取所有 sheet 名称
            excel_file = pd.ExcelFile(file_path)
            
            # 对于每个 sheet,生成一个对应的 .csv 文件
            for sheet in excel_file.sheet_names:
                # 读取当前 sheet 的数据
                excel_data = pd.read_excel(excel_file, sheet_name=sheet)
                
                # 构造新的 CSV 文件名,包含原始文件名(不带扩展)和 sheet 名称
                base_name = os.path.splitext(file_name)[0]
                csv_file_name = f"{base_name}_{sheet}.csv"
                csv_file_path = os.path.join(folder_path, csv_file_name)
                
                # 将数据保存为 CSV 文件,并指定编码为 utf-8 或 gbk
                encoding = 'utf-8'  # 或者 'gbk',根据你的具体情况选择
                excel_data.to_csv(csv_file_path, index=False, encoding=encoding)
                print(f"成功转换: {file_name} 中的 sheet '{sheet}' 使用编码 {encoding}")
        except Exception as e:
            print(f"转换失败: {file_name}, 错误信息: {e}")

print("多 sheet 文件的批量转换完成")

尝试使用 utf-8 编码进行保存,如果仍然遇到乱码问题,可以尝试使用 gbk 编码,特别是在处理中文字符时。如果你不确定应该使用哪种编码,可以根据文件内容的实际语言和地区来决定。

另外,某些情况下,Excel 文件本身可能已经包含了 BOM(字节顺序标记),在这种情况下,你可能需要在读取文件时也指定编码方式,例如:

python
深色版本
excel_data = pd.read_excel(file_path, sheet_name=sheet, encoding='utf-8-sig')

这里的 utf-8-sig 编码是带有 BOM 的 UTF-8 编码。通过这种方式,Pandas 可以正确解析文件开头的 BOM 标记,避免乱码问题。


是 xls 转换成 csv ,不是xlsx 转换成 csv

最终代码 xls 转为 csv

明白了,如果你需要将 .xls 文件(即旧版本的 Excel 文件)转换为 .csv 文件,并且遇到了乱码问题,那么处理方式与 .xlsx 文件类似,但需要注意的是读取 .xls 文件时可能需要用到 xlrd 库,因为 pandas.read_excel() 默认使用 xlrd 来处理 .xls 文件。

以下是专门针对 .xls 文件转 .csv 的代码示例,并解决了可能出现的编码问题:

python
深色版本
import os
import pandas as pd

# 指定包含 .xls 文件的文件夹路径
folder_path = 'path/to/your/folder'

# 遍历文件夹中的所有文件
for file_name in os.listdir(folder_path):
    # 检查文件是否为 .xls 文件
    if file_name.endswith('.xls'):
        # 构造完整的文件路径
        file_path = os.path.join(folder_path, file_name)
        
        try:
            # 使用 pd.ExcelFile 来读取 Excel 文件并获取所有 sheet 名称
            excel_file = pd.ExcelFile(file_path, engine='xlrd')  # 确保使用 xlrd 引擎
            
            # 对于每个 sheet,生成一个对应的 .csv 文件
            for sheet in excel_file.sheet_names:
                # 读取当前 sheet 的数据
                excel_data = pd.read_excel(excel_file, sheet_name=sheet, engine='xlrd')
                
                # 构造新的 CSV 文件名,包含原始文件名(不带扩展)和 sheet 名称
                base_name = os.path.splitext(file_name)[0]
                csv_file_name = f"{base_name}_{sheet}.csv"
                csv_file_path = os.path.join(folder_path, csv_file_name)
                
                # 将数据保存为 CSV 文件,并指定编码为 utf-8 或 gbk
                encoding = 'utf-8'  # 或者 'gbk',根据你的具体情况选择
                excel_data.to_csv(csv_file_path, index=False, encoding=encoding)
                print(f"成功转换: {file_name} 中的 sheet '{sheet}' 使用编码 {encoding}")
        except Exception as e:
            print(f"转换失败: {file_name}, 错误信息: {e}")

print("多 sheet 文件的批量转换完成")

确保你已经安装了 xlrd 库来支持 .xls 文件的读取。如果还没有安装,可以通过 pip 安装它:

bash
深色版本
pip install xlrd

关于编码的问题,尝试使用 utf-8 编码进行保存,如果仍然遇到乱码问题,可以尝试使用 gbk 编码,特别是在处理中文字符时。如果你不确定应该使用哪种编码,可以根据文件内容的实际语言和地区来决定。

另外,如果 .xls 文件是以 UTF-8 编码保存并且带有 BOM(字节顺序标记),你可以尝试在保存 CSV 文件时使用 utf-8-sig 编码,这有助于正确解析文件开头的 BOM 标记,避免乱码问题。

请替换 'path/to/your/folder' 为你实际的文件夹路径,并根据需要调整编码设置。


普通分类: