Python - переименование файла - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь переименовать набор файлов в папке из .Xlsx в .xls. Это то, что я сделал до сих пор:

allFiles = glob.glob("/*.Xlsx") # Folder that has all the files
renamed = []
for filename in allFiles:
    if filename.endswith(".Xlsx"):
        os.rename(filename, filename[:-5])
        renamed.append(filename[:-5]) # removed the .Xlsx extension
        os.path.join(renamed, '.xls') # this fails

Я пытаюсь увидеть, как мне добавить .xls в список выше renamed

Ответы [ 4 ]

4 голосов
/ 24 апреля 2019

Если я читаю эту строку за строкой, я думаю

Это удаляет все расширения .xlsx файла на диске

os.rename(filename, filename[:-5])         # Problem 1

Затем добавляет имя без расширения в список

renamed.append(filename[:-5])

и затем пытается соединить что-то а) со всем массивом и б) с файлом и его расширением, а не с двумя путями

os.path.join(renamed, '.xls')             # Problem 2 and 3

Вы бы предпочли

newname = filename[:-5]                  # remove extension
newname = newname + ".xls"               # add new extension
os.rename(filename, newname)             # rename correctly
renamed.append( ... )                    # Whatever name you want in the list

Также обратите внимание, что if filename.endswith(".Xlsx"): может быть False для всех файлов, заканчивающихся строчными буквами .xlsx.

Вместо [:-5] вы также можете воспользоваться помощью операционной системы:

import glob
import os

allFiles = glob.glob("c:/test/*.xlsx")
renamed = []
for filename in allFiles:
    path, filename = os.path.split(filename)
    basename, extension = os.path.splitext(filename)
    if extension == ".xlsx":
        destination = os.path.join(path, basename+".xls")
        os.rename(filename, destination)

И только к сведению: если переименование является единственной целью программы, попробуйте ren *.xlsx *.xls в командной строке Windows.

1 голос
/ 24 апреля 2019
  1. С вашим глобальным вызовом if filename.endswith(".Xlsx"): всегда должно быть истинным.

  2. Вы перепутали свой заказ:

    os.rename(filename, filename[:-5])  # this renames foo.Xlsx to foo, everything after it is too late.
    renamed.append(filename[:-5]) # This adds the file w/o the extension, but also w/o the new extension.
    os.path.join(renamed, '.xls') # This is a statement which would produce a result if called correctly (i. e. with a string instead of a list), but the result is discarded.
    

    Вместо этого, делай

    basename = filename[:-5]
    newname = os.path.join(basename, '.xls')
    os.rename(filename, newname)
    renamed.append(basename) # or newname? Choose what you need.
    
0 голосов
/ 24 апреля 2019

Если я правильно понял, вы сейчас делите процесс на следующие шаги:

  • Удалите расширение xlsx
  • Добавить файл в список (без расширения)
  • Добавить новое расширение к файлу (это не удается, поскольку os.path.join не будет принимать список в качестве входных данных)

Чтобы было проще, я бы переименовал только в новое расширение, а если вам нужен список renamed, заполните его. Вот так:

allFiles = glob.glob("/*.Xlsx") <- Folder that has all the files
renamed = []
for filename in allFiles:
    if filename.endswith(".Xlsx"):
        new_name = filename[:-5]+'.xls'
        os.rename(filename, new_name)
        renamed.append(new_name)
0 голосов
/ 24 апреля 2019

os.path.join не переименовывает файл.Вы должны напрямую переименовать его с помощью метода os.rename, выполнив:

os.rename(filename, filename[:-5]+'.xls')
...