Чтение текстового файла в строку

#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