У меня есть fileA.txt как:

000001 
0012
1122 
00192
..

Файл размером около 25 КБ со случайным числом в каждой строке.

Я хочу переставить все эти числа с помощью 8-значной фиксированной длины , как показано ниже:

00000001
00000012
00000112
00000192

Я попробовал это:

f = open('fileA.txt', 'r')
content = f.readlines()
nums = [ int(x.rstrip('\n')) for x in content]
print nums
f.close()

Выход:

[1, 12, 1122, 192]

Я хочу изменить эти числа, и даже сжатие списка будет зависать здесь для оригинального файла. Как это сделать?

0
Shivkumar kondi 7 Янв 2017 в 16:31

4 ответа

Лучший ответ
with open('test.txt') as f:
    for line in f:
        f_line = '{:08}'.format(int(line))
        print(f_line)

Вне:

00000001
00000012
00001122
00000192

Понимание списка:

with open('test.txt') as f:
    lst = ['{:08}'.format(int(line)) for line in f]

Вне:

['00000001', '00000012', '00001122', '00000192']

.

format_spec ::=  [[fill]align][sign][#][0][width][,][.precision][type]

width - это десятичное целое число, определяющее минимальную ширину поля . Если не указано, то ширина поля будет определяться содержимым. Добавление поля ширины к нулевому ('0') символу позволяет использовать знак дополнение нулями для числовых типов. Это эквивалентно символу заполнения '0' с типом выравнивания '='.

синтаксис форматной строки

3
宏杰李 7 Янв 2017 в 13:46

Вы можете использовать zfill метод, чтобы заполнить свои номера ' 0 ' .

nums = [ x.rstrip('\n').zfill(8) for x in content]
2
Maurice Meyer 7 Янв 2017 в 13:36

Если файл слишком большой, не загружайте все данные вместе и не обрабатывайте их. Вместо этого прочитайте строку одну за другой и обработайте каждую строку одну за другой.

with open('fileA.txt', 'r') as f:
   with open('fileB.txt', 'w') as o: # newfile to fixed
       for line in f:
           val = line.strip('\n').zfill(8)
           print val
           o.write(val + '\n')
2
Roshan 7 Янв 2017 в 13:45

Используйте str.format, чтобы сделать это:

>>> with open('nums.txt') as f:
...     for line in f:
...         print('{:0>8}'.format(line.strip()))
... 
00000001
00000012
00001122
00000192

0 является символом заполнения, > указывает выравнивание по правому краю, а 8 - шириной заполненной строки.

2
snakecharmerb 7 Янв 2017 в 13:42