Кроме нескольких незначительных изменений, из-за того, как Python изменился во времени, это выглядит прекрасно.
Вы смешиваете два разных стиля next ();старый путь был it.next (), а новый следующий (это).Вы должны использовать строковый метод split () вместо прохождения через строковый модуль (этот модуль существует в основном для обратной совместимости с Python 1.x).Нет необходимости использовать проход через практически бесполезный модуль fileinput, поскольку дескриптор открытого файла также является итератором (этот модуль появился еще до того, как дескрипторы файла Python стали итераторами).
Редактировать: как указывал @codeape, glob () возвращает полный путь.Ваш код не сработал бы, если бы indir был чем-то отличным от «./».Я изменил следующее, чтобы использовать правильное решение listdir / os.path.join.Я также более знаком с интерполяцией строк «%», чем с форматированием строк.
Вот как я мог бы написать это в более идиоматическом современном Python
def reformat(fin, fout):
fout.write(next(fin)) # just copy the first line (the header) to output
for line in fin:
fields = line.split(' ')
# Make a format header specific to the number of fields
fmt = '%6.2f' + ('%10.6f' * (len(fields)-1)) + '\n'
fout.write(fmt % tuple(map(float, fields)))
basenames = os.listdir(indir) # get a list of input ASCII files to be processed
for basename in basenames:
input_filename = os.path.join(indir, basename)
output_filename = os.path.join(outdir, basename)
with open(input_filename, 'r') as fin, open(output_filename, 'w') as fout:
reformat(fin, fout)
Zen of Python: «Тамдолжен быть один - и желательно только один - очевидный способ сделать это ".Интересно, как вы работаете, что в течение последних 10 с лишним лет было «очевидно» правильным решением, но уже не так.:)