#python
#python
Вопрос:
Я только начинаю изучать python, и у меня есть текстовый файл, который выглядит так:
Hello
World
Hello
World
И я хочу добавить числа «55» к началу и концу каждой строки, начинающейся с «привет»
Числа ’66’ для начала и каждая из каждой строки, начинающейся с ‘World’
и т. д
Итак, мой окончательный файл должен выглядеть так:
55Hello55
66World66
55Hello55
66World66
Я читаю файл сразу, сохраняю его в строке, а затем пытаюсь соответствующим образом добавить
fp = open("test.txt","r")
strHolder = fp.read()
print(strHolder)
if 'Hello' in strHolder:
strHolder = '55' strHolder '55'
if 'World' in strHolder:
strHolder = '66' strHolder '66'
print(strHolder)
fp.close()
Однако мои строковые значения ’55’ и ’66’ всегда добавляются в начало файла и в конец файла, а не в начало определенной строки и в конец строки, где я получаю этот вывод строки:
6655Hello
World
Hello
World
5566
Любая помощь будет высоко оценена.
Комментарии:
1. Всего один комментарий от первоначального просмотра вашего кода (и не обязательно проблема прямо сейчас). Не используйте
str
в качестве имени переменной. Это затеняет встроенноеstr
, что приведет к очень неожиданному поведению в вашем коде.2. Звучит неплохо, я его изменю.
3. Это:
fp.read().replace('nHello','n55Hello55').replace('nWorld','n66World66')
?
Ответ №1:
Вы читаете весь файл сразу с .read()
помощью .
Вы можете прочитать его построчно в for
цикле.
new_file = []
fp = open("test.txt", "r")
for line in fp:
line = line.rstrip("n") # The string ends in a newline
# str.rstrip("n") removes newlines at the end
if "Hello" in line:
line = "55" line "55"
if "World" in line:
line = "66" line "66"
new_file.append(line)
fp.close()
new_file = "n".join(new_file)
print(new_file)
Вы могли бы сделать все это сразу, прочитав весь файл и разделив его на » n» (новая строка)
new_file = []
fp = open("text.txt")
fp_read = fp.read()
fp.close()
for line in fp_read.split("n"):
if "Hello" # ...
но это приведет к загрузке всего файла в память сразу, в то время как цикл for загружает только построчно (так что это может не сработать для файлов большего размера).
Поведение этого заключается в том, что если в строке есть «Hello», она получит «55» до и после нее (даже если строка » sieohfoiHellosdf «) и то же самое для «World», и если в ней есть как «Hello», так и «World» (например, «Привет, Мир!» или «asdifhoasdfhHellosdjfhsodWorldosadh») он получит «6655» до и после него.
Просто в качестве примечания: вы должны использовать with
для открытия файла, поскольку это гарантирует, что файл будет закрыт позже.
new_file = []
with open("test.txt") as fp: # "r" mode is default
for line in fp:
line = line.rstrip("n")
if "Hello" in line:
line = "55" line "55"
if "World" in line:
line = "66" line "66"
new_file.append(line)
new_file = "n".join(new_file)
print(new_file)
Комментарии:
1. есть ли способ сделать это, не читая его построчно?
2. Используйте rstrip вместо нарезки
3. Хорошо
line.rstrip("n")
бы исправить эту проблему, в которой я очень сомневаюсь. Также по вашей собственной логике, что произойдет, если у вас не было новой строки после последней строки? Это лишило бы символ
Ответ №2:
Вам нужно выполнить итерацию по каждой строке файла, чтобы получить желаемый результат. В вашем коде, который вы используете .read()
, вместо этого используйте .readlines()
для получения списка всех строк.
Ниже приведен пример кода:
lines = []
with open("test.txt", "r") as f:
for line in f.readlines(): # < Iterate over each line
if line.startswith("Hello"): # <-- check if line starts with "Hello"
line = "55{}55".format(line)
elif line.startswith("World"):
line = "66{}66".format(line)
lines.append(line)
print "n".join(lines)
Зачем использовать with
? Проверьте документ Python:
Оператор ‘with‘ уточняет код, который ранее использовал бы блоки try … finally, чтобы гарантировать выполнение кода очистки. В этом разделе я рассмотрю это утверждение в том виде, в каком оно обычно используется. В следующем разделе я рассмотрю детали реализации и покажу, как писать объекты для использования с этим оператором.
Оператор ‘with‘ — это структура потока управления, базовая структура которой:
с выражением [как переменной]: с-block
Вычисляется выражение, и оно должно привести к объекту, который поддерживает протокол управления контекстом (то есть имеет методы enter() и exit()).
Ответ №3:
после того, как вы прочитали файл:
read_file = read_file.replace('hello','55hello55')
Он заменит все приветствия на 55hello55
и используйте with open(text.txt, 'r' ) as file_hndler:
Ответ №4:
Для чтения текстового файла я рекомендую следующий способ, совместимый с Python 2 и 3:
import io
with io.open("test", mode="r", encoding="utf8") as fd:
...
Здесь я делаю предположение, что ваш файл использует кодировку uft8.
Используя with
инструкцию, убедитесь, что файл закрыт в конце чтения, даже если возникает ошибка (исключение). Чтобы узнать больше о context manager, взгляните на библиотеку Context .
Существует несколько способов чтения текстового файла:
- прочитайте весь файл с помощью:
fd.read()
, или - чтение построчно с циклом:
for line in fd
.
Если вы читаете весь файл, вам нужно разделить строки (см. Раздел str.splitlines . Вот два решения:
with io.open("test", mode="r", encoding="utf8") as fd:
content = fd.read()
for line in content.splilines():
if "Hello" in line:
print("55" line "55")
if "World" in line:
print("66" line "66")
Или
with io.open("test", mode="r", encoding="utf8") as fd:
for line in content.splilines():
line = line[:-1]
if "Hello" in line:
print("55" line "55")
if "World" in line:
print("66" line "66")
Если вам нужно записать результат в другой файл, вы можете открыть выходной файл в режиме записи и использовать print(thing, file=out)
следующим образом:
with io.open("test", mode="r", encoding="utf8") as fd:
with io.open("test", mode="w", encoding="utf8") as out:
for line in content.splilines():
line = line[:-1]
if "Hello" in line:
print("55" line "55", file=out)
if "World" in line:
print("66" line "66", file=out)
Если вы используете Python 2, вам понадобится следующая директива для использования функции печати:
from __future__ import print_function