Динамические имена файлов

1

Итак, я работаю над программой, в которой храню данные в нескольких файлах .txt. Соглашение об именах, которое я хочу использовать, это файл "xx", где Xs - это числа, поэтому file00, file01,... вплоть до file20, и я хочу, чтобы переменные, назначенные им, были fxx (f00, f01,...).

Как я могу получить доступ к этим файлам в Python с помощью цикла for (или метода пыльника), поэтому мне не нужно вводить open("fileXX") 21 раз?

Теги:
filenames

5 ответов

1
Лучший ответ

Пример записи t ко всем файлам:

for x in range(22): #Remember that the range function returns integers up to 22-1
    exec "f%02d = open('file%02d.txt', 'w')" % (x, x)

Я использую оператор exec, но, вероятно, лучший способ. Надеюсь, вы поняли эту идею.

ПРИМЕЧАНИЕ. Этот метод даст вам имена переменных fXX для работы с позже, если это необходимо. Последние две строки - это просто примеры. Не нужно, если вам нужно только назначить fileXX.txt fXX.

РЕДАКТИРОВАТЬ: Удалены две последние две строки, потому что казалось, что люди просто недовольны тем, что я их там положил. Объяснения для downvotes всегда приятны.

  • 0
    Почему вы используете exec ? Вы можете просто повторно использовать переменную, хранящую дескриптор файла, так что нет необходимости создавать переменные с разными именами - единственная интерполяция, которую вам нужно сделать, - это имя файла: f = open('file%02d.txt' % x, 'w') .
  • 1
    Потому что ОП может понадобиться эти переменные в этом формате позже, когда он говорит: «Я хочу, чтобы назначенные им переменные были fxx (f00, f01 ...)» . Использование только f = не позволит ему иметь эти имена переменных. exec позволяет ему иметь имена переменных, которые ему нужны
Показать ещё 5 комментариев
5

Имена регулярны. Вы можете создать список имен файлов с простым пониманием списка.

["f%02d"%x for x in range(1,21)]
  • 0
    Для получения дополнительной информации о интерполяции строк: docs.python.org/library/…
1

Я думаю, что точкой является то, что OP хочет зарегистрировать переменные programagically:

for i in range( 20 ):
    locals()[ "f%02d" % i ] = open( "file%02d.txt" % i )

а затем, например,

print( f01 )
...
  • 0
    Как бы locals() будут отличаться от globals() и vars() ? Если все это в цикле (а не в функции), вы можете использовать любой из них, или я что-то упустил?
  • 0
    @ vlad003 - docs.python.org/tutorial/… Кроме того, поиск глобальной переменной медленнее, чем поиск локальной переменной, поэтому помимо обычного избегания глобальных переменных также существует разница в скорости.
Показать ещё 3 комментария
1

Посмотрите на python модуль glob.

Он использует обычный синтаксис подстановки оболочки, поэтому ?? будет соответствовать любым двум символам, тогда как * будет соответствовать чему-либо. Вы можете использовать либо f??.txt, либо f*.txt, но первый является более строгим соответствием и не будет соответствовать чему-то вроде fact_or_fiction.txt, в то время как последний будет.

например:.

import glob
for filename in glob.iglob('f??.txt'):
    infile = file(filename)
    # Do stuff...
  • 4
    glob - отличный вариант. Однако, если вы хотите получить доступ только к определенному набору (скажем, существует f0-99, но вы хотите только f0-19), вы можете использовать интерполяцию строк: "f%02d" % 4 становится "f04" .
  • 0
    +1 к Амбер. Я бы использовал glob, только если бы я хотел, чтобы все файлы соответствовали шаблону. Для серии файлов, имена которых известны априори, я бы сгенерировал имена.
Показать ещё 4 комментария
0
files = [open("file%02d", "w") for x in xrange(0, 20+1)]
# now use files[0] to files[20], or loop

# example: write number to each file
for n, f in enumerate(files):
  files.write("%d\n" % n)

# reopen for next example
files = [open("file%02d", "r") for x in xrange(0, 20+1)]
# example: print first line of each file
for n, f in enumerate(files):
  print "%d: %s" % (n, f.readline())

Ещё вопросы

Сообщество Overcoder
Наверх
Меню