У меня есть текстовый файл:
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 выровнялся в одном и том же месте в конце каждой строки и жестко закодировал его.
Тогда что должно произойти, если у вас есть строка типа "a" * 100
?
Я добавляю N. Исходный текстовый файл, который мне нужен, представляет собой банковский файл с набором символов и без N в конце.
файл, который я получаю, содержит одни и те же символы для каждой строки, но символы меняются, поэтому файлу должно быть что-то вроде этого: аааа аааааааааааа сложно форматировать, каждый думайте о a как о отдельной строке, и для этого требуется N в символе 88
Когда вы впервые попытались задать вопрос, вам указали на несколько косвенных ошибок; ты не читал эти комментарии?
@PatrickPerea Вы не объяснили, что должно произойти, если данные, которые предшествуют N, содержат 88 или более символов.
Кстати, это не обязательно делать f.close()
в рамках ничьего заявления.
Никакие данные не должны предшествовать N, как в моем примере, это будут пространства данных, равные 87, а N в пространстве 88. Я решил проблему. Спасибо всем, просто смотрю, как пометить задачу как решенную.
Вы можете использовать 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
Я заставил его работать и работать с настоящими файлами, спасибо.
Он меняет его на одну строку, потому что видит только следующий код, который говорит: просто добавьте пробел между ними.
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))
... но это не изменяет входной файл, который, как я считаю, является обязательным
Если чтение всего содержимого файла в память не является проблемой (ограничения ОЗУ) и если ни одна строка не превышает ограничение ширины в 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).
Итак, если сама линия больше, чем отступ, вы просто хотите добавить
"N"
в конце? неважно, если оно не совпадает?