line.strip()方法澄清

问题描述 投票:1回答:3

语言:python(版本:3.7.3)熟练程度:新手

我想删除文件每行中的所有前导和尾随空格。因此我使用了in-build方法'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>
python python-3.x
3个回答
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)打开文件会将文件截断为零长度并从头开始写入。


0
投票

代码问题:

  • 您正在尝试写入相同的输入文件。

还尝试对您阅读的行和您创建的新行使用不同的变量。这是一个很好的做法。

请参阅下面的更新代码

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")

-1
投票

您可以使用另一个文件来存储中间结果,然后用它替换原始文件。在这里,您正在阅读和写入同一个文件。

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')
© www.soinside.com 2019 - 2024. All rights reserved.