Итак, я работаю над программой, в которой храню данные в нескольких файлах .txt. Соглашение об именах, которое я хочу использовать, это файл "xx", где Xs - это числа, поэтому file00, file01,... вплоть до file20, и я хочу, чтобы переменные, назначенные им, были fxx (f00, f01,...).
Как я могу получить доступ к этим файлам в Python с помощью цикла for (или метода пыльника), поэтому мне не нужно вводить open("fileXX")
21 раз?
Пример записи 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 всегда приятны.
Имена регулярны. Вы можете создать список имен файлов с простым пониманием списка.
["f%02d"%x for x in range(1,21)]
Я думаю, что точкой является то, что OP хочет зарегистрировать переменные programagically:
for i in range( 20 ):
locals()[ "f%02d" % i ] = open( "file%02d.txt" % i )
а затем, например,
print( f01 )
...
locals()
будут отличаться от globals()
и vars()
? Если все это в цикле (а не в функции), вы можете использовать любой из них, или я что-то упустил?
Посмотрите на python модуль glob.
Он использует обычный синтаксис подстановки оболочки, поэтому ??
будет соответствовать любым двум символам, тогда как *
будет соответствовать чему-либо. Вы можете использовать либо f??.txt
, либо f*.txt
, но первый является более строгим соответствием и не будет соответствовать чему-то вроде fact_or_fiction.txt
, в то время как последний будет.
например:.
import glob
for filename in glob.iglob('f??.txt'):
infile = file(filename)
# Do stuff...
glob
- отличный вариант. Однако, если вы хотите получить доступ только к определенному набору (скажем, существует f0-99, но вы хотите только f0-19), вы можете использовать интерполяцию строк: "f%02d" % 4
становится "f04"
.
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())
exec
? Вы можете просто повторно использовать переменную, хранящую дескриптор файла, так что нет необходимости создавать переменные с разными именами - единственная интерполяция, которую вам нужно сделать, - это имя файла:f = open('file%02d.txt' % x, 'w')
.f =
не позволит ему иметь эти имена переменных.exec
позволяет ему иметь имена переменных, которые ему нужны