переименовать несколько файлов, используя glob с Python (файл уже существует) - PullRequest
1 голос
/ 26 октября 2019

Я пытаюсь переименовать несколько файлов в каталоге с помощью Python, но счетчик внутри цикла никогда не обновляется, поэтому я получаю ошибку «файл уже существует».

Как получить обновленную переменную (i), чтобы имя файла никогда не повторялось?

def change_name():

    for i, filename in enumerate(glob.glob(current_dir + '\packettest.txt')):
        os.rename(filename, os.path.join(current_dir, 'packettest_sent' + str(i) + '.txt' ))
        i = i + 1

Это ошибка, которую я получаю:

os.rename(filename, os.path.join(current_dir, 'packettest_sent' + str(i) + '.txt' ))
WindowsError: [Error 183] Cannot create a file when that file already exists

РЕДАКТИРОВАТЬ:

Благодаря вашим комментариям я понимаю, что делает перечисление, но проблема сохраняется, я все еще равен 0. Это мой полный код:

import os.path
import sys
import glob
import time
current_dir = os.getcwd()
file_path = current_dir + "\packettest.txt"

#def main():

def change_name():

    for i, filename in enumerate(glob.glob(current_dir + '\packettest.txt')):
        os.rename(filename, os.path.join(current_dir, 'packettest_sent' + str(i) + '.txt' ))

def packet_listener():
    while not os.path.exists(file_path):
        time.sleep(1)
        print "waiting..."

    if os.path.isfile(file_path):
        # read file
        change_name()
        time.sleep(1)
        packet_listener()
        print "OK"    
    else:
        raise ValueError("%s isn't a file!" % file_path)

if __name__ == '__main__':
    packet_listener()

Спасибо за продвижение.

PS: извините за мой плохой английский

Ответы [ 2 ]

2 голосов
/ 26 октября 2019

Ниже (избегайте увеличения i, поскольку перечисление уже делает это)

def change_name():
    for i, filename in enumerate(glob.glob(current_dir + '\packettest.txt')):
        os.rename(filename, os.path.join(current_dir, 'packettest_sent' + str(i) + '.txt' ))
0 голосов
/ 27 октября 2019

Пожалуйста, замените этот кусок кода:

for i, filename in enumerate(glob.glob(current_dir + '\packettest.txt')):
    os.rename(filename, os.path.join(current_dir, 'packettest_sent' + str(i) + '.txt' ))

следующим:

for i, filename in enumerate(glob.glob(current_dir + '\packettest.txt')):
    new_name = os.path.join(current_dir, 'packettest_sent' + str(i) + '.txt' )
    if os.path.isfile( new_name ) :
        print( 'file exists:', new_name )
    else :
        os.rename(filename, new_name)

И, пожалуйста, подумайте дважды об этом: enumerate(glob.glob(current_dir + '\packettest.txt')), что пытаетесь сделать? Есть только один файл, вы не используете подстановочные знаки (* и т. Д.), Зачем вам нужен цикл и каких результатов вы ожидаете?

...