Я пытаюсь создать несколько файлов в одной папке с разными именами с помощью python

#python #python-datetime

Вопрос:

Мне нужно создать 5 файлов, все в одной папке с разными именами, но при запуске я получаю только один файл.

 a = 1
x = datetime.now()

while a < 5:
    a  = 1
    path = r'C:UsersUser1DesktopNewfolder'
    file_name = x.strftime('%d-%m-%Y-%H-%M-%S-%f=HDTV.txt')
        
     with open(os.path.join(path, file_name), 'w') as fp:
         fp.write('this is a test')
 

Комментарии:

1. x определяется только в начале (вне цикла). Вы должны поместить x его внутрь цикла и, возможно, добавить time.sleep(0.01) , просто чтобы убедиться, что вы не делаете что-то быстро.

Ответ №1:

Как сказал @Giacomo, проблема в том, что метка времени не зависит от цикла:

 a = 1
x = datetime.now

while a < 5:
    a  = 1
    path = r'C:UsersUser1DesktopNewfolder'
    file_name = x().strftime('%d-%m-%Y-%H-%M-%S-%f=HDTV.txt')
        
     with open(os.path.join(path, file_name), 'w') as fp:
         fp.write('this is a test')
 

Комментарии:

1. внимательно изучите код, now который будет вызываться внутри цикла на каждом шаге. Это не элегантно, но хорошо объясняет разницу между 2 позициями вызова

2. хе-хе, упустил это из виду ^^ так что для удобства чтения, может быть, я бы поставил datetime.now() вместо x() этого 😉

3. Даже при этом создается только один файл.

Ответ №2:

В первую очередь:

x должно присутствовать внутри while цикла, так как вам нужно текущее время на каждой итерации.

Кроме того, я думаю, что между созданием файлов не так много разницы во времени, и именно поэтому текущий созданный файл переопределяет предыдущий файл (так как метка времени одинакова, как и имена файлов).

У меня есть 2 предложения:

1. Использование различных имен файлов

Я предлагаю использовать эту переменную a в имени файла, чтобы у вас были разные имена файлов.

 import os
from datetime import datetime
path = os.getcwd()
a = 1
while a < 5:
    x = datetime.now()
    file_name = f"{x.strftime('%d-%m-%Y-%H-%M-%S-%f=HDTV')}_{a}.txt"
    
    with open(os.path.join(path, file_name), 'w') as fp:
        fp.write(f'this is a test')

    a  = 1
 

2. Использование time.sleep()

Другой способ-вы можете использовать time.sleep() для приостановки выполнения на некоторое время (в зависимости от ваших требований), чтобы имена файлов отличались на каждой итерации.

Комментарии:

1. Это неправильный путь, потому что проблема заключалась не в скорости цикла, а в том, что метка времени не зависит от самого цикла.

2. Но метка времени вычисляется каждый раз внутри цикла. Верно?

3. Мой комментарий относится к описанию, а не к коду, код правильный.