Дополнение до определенного уровня и добавление символа в конце

У меня есть текстовый файл:

a
aaa
aaa
a

Мой желаемый результат:

a                               N
aaa                             N
aaa                             N
a                               N

Я написал следующее:

newf = ""
with open('testfile.txt','r') as f:
   for line in f:
     if len(line) < 87:
         newf+=line.strip()+" "
     else:
        newf+=line.strip()+"N\n"
   f.close()
with open('testfile.txt','w') as f:
  f.write(newf)
  f.close()

Когда я запускаю это, мой результат становится:

a aaa aaa a

Я не могу понять, почему он меняет вывод на одну строку.

Итак, если сама линия больше, чем отступ, вы просто хотите добавить "N" в конце? неважно, если оно не совпадает?

S.B 24.06.2024 18:44

Вы хотите, чтобы заполнение вычислялось программно или жестко запрограммировано?

S.B 24.06.2024 18:44

Мне нужно, чтобы N выровнялся в одном и том же месте в конце каждой строки и жестко закодировал его.

Patrick Perea 24.06.2024 18:45

Тогда что должно произойти, если у вас есть строка типа "a" * 100?

S.B 24.06.2024 18:46

Я добавляю N. Исходный текстовый файл, который мне нужен, представляет собой банковский файл с набором символов и без N в конце.

Patrick Perea 24.06.2024 18:46

файл, который я получаю, содержит одни и те же символы для каждой строки, но символы меняются, поэтому файлу должно быть что-то вроде этого: аааа аааааааааааа сложно форматировать, каждый думайте о a как о отдельной строке, и для этого требуется N в символе 88

Patrick Perea 24.06.2024 18:47

Когда вы впервые попытались задать вопрос, вам указали на несколько косвенных ошибок; ты не читал эти комментарии?

tripleee 24.06.2024 19:27

@PatrickPerea Вы не объяснили, что должно произойти, если данные, которые предшествуют N, содержат 88 или более символов.

SIGHUP 24.06.2024 19:57

Кстати, это не обязательно делать f.close() в рамках ничьего заявления.

Ignatius Reilly 24.06.2024 20:16

Никакие данные не должны предшествовать N, как в моем примере, это будут пространства данных, равные 87, а N в пространстве 88. Я решил проблему. Спасибо всем, просто смотрю, как пометить задачу как решенную.

Patrick Perea 24.06.2024 21:38
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
10
59
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вы можете использовать f-строки, чтобы помочь вам в форматировании.

def reformat_file(filename, desired_length=87, suffix='N'):
    lines = []
    with open(filename, 'r') as fp:
        for line in fp:
            line = line.strip()
            formatted = line
            if len(line) < desired_length:
                formatted = f"{line:{desired_length}}{suffix}"

            lines.append(formatted)

    with open(filename, 'w') as fp:
        fp.write('\n'.join(lines))

    return

if __name__ == "__main__":
    reformat_file("testfile.txt")

Запуск reformat_file, где testfile.txt содержит приведенное ниже

a
aaa
aaa
a
a really long line that will have more than the threshold number of characters is written here.
abc

Перезапишу вместо testfile.txt следующее.

a                                                                                      N
aaa                                                                                    N
aaa                                                                                    N
a                                                                                      N
a really long line that will have more than the threshold number of characters is written here.
abc                                                                                    N

Я заставил его работать и работать с настоящими файлами, спасибо.

Patrick Perea 24.06.2024 21:39

Он меняет его на одну строку, потому что видит только следующий код, который говорит: просто добавьте пробел между ними.

newf+=line.strip()+" "

Если вы хотите желаемого результата, вы можете изменить приведенное выше на что-то вроде следующего.

newf+=line.strip()+"\t\t\t\t\tN\n"

отрегулируйте количество вкладок с желаемым интервалом.

самое простое это просто f-string

for line in f:
    if len(line) < 87:
        print(f'{line:<87}N')
    else:
        line = list(line)
        line[87] = 'N'
        print(''.join(line))

... но это не изменяет входной файл, который, как я считаю, является обязательным

SIGHUP 24.06.2024 20:21

Если чтение всего содержимого файла в память не является проблемой (ограничения ОЗУ) и если ни одна строка не превышает ограничение ширины в 88 символов, тогда:

with open("testfile.txt", "r+") as f:
    lines = list(map(str.rstrip, f))
    f.seek(0)
    for line in lines:
        f.write(f"{line:<88}N\n")
    f.truncate()

Константа 88 может быть равна 87 в зависимости от того, где в строке находится позиция 88 (смещение 0 или 1).

Другие вопросы по теме

Похожие вопросы

Расширение Python GDB: я пытаюсь получить вызывающую строку и информацию о файле для вызова макроса, но получаю неправильные значения из-за комментариев
Аутентификация ManagedIdentityCredential недоступна. Запрошенный идентификатор не был назначен этому ресурсу
Использование REST API в Python для запуска рабочих процессов в Azure Purview
Как исправить столбец с числовыми значениями, который воспринимается как строковое поле из-за пустых строк в фрейме данных Pandas?
Как оценить цвет изображения Pyplot в данной точке?
Возможно ли иметь встроенное определение класса данных в Python?
Добавьте значения двух Dataframe на основе похожих значений строк
С помощью Python извлеките в файл Excel значение ячейки в строке, где ячейка в той же строке содержит строку символов из XML-файла
Обмен датой начала, датой окончания и другими столбцами с более ранней строкой, если даты больше 8 в фрейме данных pandas
Почему мой столбец row_number в PySpark испорчен при применении схемы?