在for循环中剥离扩展

时间:2017-12-06 00:42:08

标签: python excel glob os.path

我正在尝试剥离.csv扩展名,以便该文件仅保存为name.xslx而不是name.csv.xlsx,但这似乎不起作用。我将不胜感激。谢谢。

import os
import glob
import csv
import openpyxl
import os.path

#convert the csv to xslx
for csvfile in glob.glob(os.path.join('.', '*.csv')):
    wb = openpyxl.Workbook()
    ws = wb.active
    with open(csvfile, 'rb') as f:
        reader = csv.reader(f)
        for r, row in enumerate(reader, start = 1):
            for c, val in enumerate(row, start = 1):
                ws.cell(row = r, column = c).value = val
    base = os.path.basename(csvfile)
    wb.save(base + '.xlsx')

2 个答案:

答案 0 :(得分:1)

因为os.path.basename没有按照您的想法行事:

>>> csvfile = "/path/to/my_file.csv"
>>> os.path.basename(csvfile)
'my_file.csv'

可以使用os.path.splitext

>>> os.path.splitext(csvfile)
('/path/to/my_file', '.csv')

注意不好,但有点不合适。就个人而言,我更喜欢pathlib

>>> import pathlib
>>> p = pathlib.Path(csvfile)
>>> p
PosixPath('/path/to/my_file.csv')

它有一个非常好的OOP界面:

>>> p.name
'my_file.csv'
>>> p.suffix
'.csv'
>>> p.with_suffix('.xlsx')
PosixPath('/path/to/my_file.xlsx')

您通常可以直接使用pathlib.Path对象,但总是可以获取字符串,如果这是您的第三方库所期望的那样:

>>> str(p.with_suffix('.xlsx'))
'/path/to/my_file.xlsx'

答案 1 :(得分:0)

而不是basename()使用base = os.path.splitext(csvfile)[0]