【问题标题】:How to convert my xlsx files into CSV in bulk via python如何通过 python 将我的 xlsx 文件批量转换为 CSV
【发布时间】:2020-03-29 07:16:40
【问题描述】:

我正在尝试将 xlsx 文件列表转换为 csv 格式。目前我已经能够使用 xlrd 和 csv 执行此操作,但使用以下代码逐个文件:

import xlrd
import csv

def csv_from_excel():
    wb = xlrd.open_workbook(r"C:\Users\jonathon.kindred\Desktop\RM - USE\2018\JUL 2018\RM 2018-07-30.xlsx")
    sh = wb.sheet_by_name('RM')
    csv_file = open('RM 2018-07-30.csv', 'w', newline='')
    wr = csv.writer(csv_file, quoting=csv.QUOTE_ALL)

    for rownum in range(sh.nrows):
        wr.writerow(sh.row_values(rownum))

    csv_file.close()

csv_from_excel()


import pandas as pd 
import numpy as np 

df = pd.read_csv('RM 2018-07-30.csv', index_col= 0, encoding = 'iso-8859-1')

df2 = df[['Purchase Order','SKU','Markdown','Landed Cost','Original Price','Current Sale Price','Free Stock','OPO','ID Style','Supplier Style No']]

df2.to_csv(r"C:\Users\jonathon.kindred\Desktop\RM\2018\JUL 2018\RM 2018-07-30.csv", index = False)

我需要能够逐个文件夹而不是逐个文件地执行此文件夹。我已经设法使用 glob 获取下一个文件夹的列表,见下​​文:

import glob

path = r"C:\Users\jonathon.kindred\Desktop\RM - USE\2018\AUG 2018"

files = [f for f in glob.glob(path + "**/*.xlsx", recursive=True)]

for f in files:
    print(f)

问题是我发现很难将两个脚本结合起来,以便遵循以下步骤:

  1. 将 .xlsx 转换为 csv
  2. 仅选择这些列“采购订单”、“SKU”、“降价”、“到岸成本”、“原价”、“当前销售价格”、“免费库存”、“OPO”、“ID 样式”、 '供应商风格编号'
  3. 将其放入我的其他文件夹中。

这两个文件夹是; xlsx 位置:RM - USE 和目标位置:RM。

【问题讨论】:

  • 您应该将文件名作为 csv_from_excel 函数的参数传递。如果您正确列出了文件名,那么最后一个 for 中的 f 值应该是一个有效的文件名。将其传递给您的函数。

标签: python excel pandas csv


【解决方案1】:
  1. 使用os.listdir()获取特定文件夹中所有文件的列表

  2. 将 csv_from_excel() 函数放入 for 循环中以遍历列表中的每个文件

    path = "PATH/TO/FOLDER" 
    list = os.listdir(path)
    for file in list:
        fileName = str(file)
        def csv_from_excel():
            wb = xlrd.open_workbook(fileName)
            sh = wb.sheet_by_name('RM')
            csv_file = open('RM 2018-07-30.csv', 'w', newline='')
            wr = csv.writer(csv_file, quoting=csv.QUOTE_ALL)
    
            for rownum in range(sh.nrows):
                wr.writerow(sh.row_values(rownum))
    
        csv_file.close()
    
    csv_from_excel()
    

更新:要选择 CSV 文件中的多个列,请使用 pandas 将列内容存储到 pandas 数据框,然后您可以将数据框以 CSV 格式保存到新文件夹中

import pandas
#Store CSV columns into a pandas data frame
colNames = ['Purchase Order','SKU','Markdown','Landed Cost','Original Price','Current Sale Price','Free Stock','OPO','ID Style','Supplier Style No']
data = pandas.read_csv(fileName, names=colNames)
#Extract the CSV columns to a new CSV
df = pandas.DataFrame(data, columns = colNames)
df.to_csv('PATH/TO/NEW/CSV', index=False)

【讨论】:

  • 听起来不错,我该如何批量应用列选择?
【解决方案2】:

您可以只阅读您的 .xlsx 文件,选择您想要的列并仅使用 pandas 导出到 csv

df = pd.read_excel(r"C:\Users\jonathon.kindred\Desktop\RM - USE\2018\JUL 2018\RM 2018-07-30.xlsx", sheet_name='RM', usecols=['Purchase Order','SKU','Markdown','Landed Cost','Original Price','Current Sale Price','Free Stock','OPO','ID Style','Supplier Style No'])
df.to_csv('RM 2018-07-30.csv', index=False)

如果您要遍历文件和目录,glob 非常适合。 您也可以查看Pathlib库,可以帮助您只获取目录或文件、扩展名或将它们组合以获取您的导出路径。

例如,如果您有使用 glob 的文件列表:

from pathlib import Path

files = glob(files_path)
output_dir = Path('destination')
for file in files:
    df = pd.read_excel(file, sheet_name='RM', usecols=['Purchase Order','SKU','Markdown','Landed Cost','Original Price','Current Sale Price','Free Stock','OPO','ID Style','Supplier Style No'])

    output_file = Path(file)
    output_file = output_dir / '{}.csv'.format(output_file.stem)

    df.to_csv(output_file, index=False)

【讨论】:

    【解决方案3】:

    需要安装:$ pip install rows openpyxl

    import rows
    data = rows.import_from_xlsx("my_file.xlsx")
    rows.export_to_csv(data, open("my_file.csv", "wb"))
    

    【讨论】:

      猜你喜欢
      • 2020-05-06
      • 1970-01-01
      • 2018-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-05
      相关资源
      最近更新 更多