уточнение метода line.strip()

#python #python-3.x

#python #python-3.x

Вопрос:

Язык: python (версия: 3.7.3) Уровень владения: новичок

Я хочу удалить все начальные и конечные пробелы в каждой строке файла. Поэтому я использовал встроенный метод ‘strip ()’, который почти выполняет эту работу, но мой код начал бездействовать с нижней части файла, что привело к дублированию строк в файле. Любая помощь будет очень полезна для достижения цели.

Мой код выглядит следующим образом:

 class filecorrection:

    def removeLeadingandTrailingSpacesinaFile(self, fromFile):
        with open(fromFile, 'r ') as file:
            lines = file.readlines()
            for line in lines:
                file.write(line.strip()   "n")

cm = filecorrection()
cm.removeLeadingandTrailingSpacesinaFile("filepath")
  

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

 class filecorrection:

def removeLeadingandTrailingSpacesinaFile(self, fromFile):
    with open(fromFile, 'r ') as file:
        lines = file.readlines()
        **file.seek(0)**
        for line in lines:
            file.write(line.strip()   "n")

cm = filecorrection()
cm.removeLeadingandTrailingSpacesinaFile("filepath")
  

Ожидается: (удаление конечных и начальных пробелов)

 <book id="bk105">
<author>Corets, Eva</author>
<title>The Sundered Grail</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>testing</publish_date>
</book>
  

Актуально:

   <book id="bk105">
      <author>Corets, Eva</author>
      <title>The Sundered Grail</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>testing</publish_date>
   </book><book id="bk105">
<author>Corets, Eva</author>
<title>The Sundered Grail</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>testing</publish_date>
</book>
  

Комментарии:

1. Для этого вам не нужен класс. remove_leading_and_trailing_spaces_in_a_file (обратите внимание на предпочтительное соглашение об именовании методов) должно быть просто обычной функцией.

Ответ №1:

Вы можете открыть файл дважды следующим образом

 class filecorrection:

    def removeLeadingandTrailingSpacesinaFile(self, fromFile):
        lines = []

        with open(fromFile, 'r') as file:
            lines = file.readlines()

        with open(fromFile, "w") as file:
            for line in lines:
                file.write(line.strip()   "n")

cm = filecorrection()
cm.removeLeadingandTrailingSpacesinaFile("test.xml")
  

вместо того, чтобы пытаться одновременно читать и записывать в файл. Открытие файла в режиме записи ( w ) приведет к усечению файла до нулевой длины и началу записи с самого начала.

Комментарии:

1. Открытие файла в w режиме mode, прежде всего, приведет к его усечению, а не только к установке указателя в начале, который OP уже пытался использовать seek(0) .

2. Запись в другой файл работает, как и ожидалось. Однако есть ли альтернатива для достижения того же в том же файле?

3. @PrasadRajassekaran Безопаснее сначала записывать в отдельный файл и заменять оригинал только после того, как вы узнаете, что полная запись прошла успешно, чтобы избежать повреждения вашего оригинала в случае ошибки.

4. Это приведет к записи поверх того же файла, что и запись в другой файл.

Ответ №2:

Проблемы с вашим кодом:

  • Вы пытаетесь выполнить запись в тот же входной файл.

Также попробуйте использовать разные переменные для строк, которые вы читаете, и для новых строк, которые вы создаете. Это хорошая практика.

Смотрите обновленный код ниже.

 with open(fromFile, 'r ') as infile, 
     open(writeFile, 'w') as outfile:
            for line in infile:
                new_line = line.rstrip('n').strip()

                #now write the new line to out file 
                outfile.write(new_line   "n")
  

Ответ №3:

Вы можете использовать другой файл для хранения промежуточных результатов, а затем заменить им исходный файл. Здесь вы читаете и записываете в один и тот же файл.

 import pathlib
import shutil

class filecorrection:

    def removeLeadingandTrailingSpacesinaFile(self, fromFile):
        parent_path=pathlib.Path(fromFile).parent

        # Make sure you have permissions to create a file. If not
        # you can save intermediate results in memory instead.
        temp_file = str(parent_path / "temp_file")
        with open(fromFile, 'r ') as file, open(temp_file, 'w ') as temp:
            for line in file:
                temp.write(line.strip() "n")

        shutil.move(temp_file, fromFile)

cm = filecorrection()
cm.removeLeadingandTrailingSpacesinaFile('file.txt')