Python:防止fileinput添加换行符字符

25

我正在使用Python脚本在给定目录的文本文件中查找并替换特定字符串。 我正在使用fileinput模块来简化查找和替换操作,即读取文件,替换文本并将其写回到同一文件。

代码如下:

import fileinput
def fixFile(fileName):
    # Open file for in-place replace
    for line in fileinput.FileInput(fileName, inplace=1):
        line = line.replace("findStr", "replaceStr")
        print line  # Put back line into file

问题在于写入的文件有以下问题:

  1. 每一行之后插入了一个空白行。
  2. 每一行的末尾插入了Ctrl-M字符。

我该如何防止这些额外的附加内容被插入到文件中?

6个回答

44

你的换行符来自于 print 函数

使用:

import sys

sys.stdout.write ('some stuff')

而你的换行符将会消失


1
非常感谢!这解决了额外的行和Ctrl-M字符问题。我已选择您的回复作为此问题的解决方案。如果您愿意,可以添加一些额外的信息到您的答案中。 - Ashwin Nanjappa
1
请问您能否添加一些细节呢? :) - Pitto
如果我将print替换为sys.stdout.write,可能会发生变化,它会打印到控制台,而文件最终为空。 - Zitrax

10
使用
print line,
或者
file.write(line)

修复额外的换行。

[Ctrl]-[M] 的出现可能是由于使用 DOS 编码的输入文件引起的。


谢谢。你的解决方案去掉了空行,但仍然有 Ctrl-M 字符。已经有另一个人提出了一个可以同时解决这两个问题的答案。 - Ashwin Nanjappa

7

不要这样做:

print line  # Put back line into file

请使用以下内容:
print line,  # Put back line into file

@Paul Fleming,在print语句后面加上逗号对我有用。你能解释一下为什么逗号可以防止新行被写入吗?谢谢。 - teamg
@teamg 不是我的答案,也不知道你的问题的答案。抱歉! - Paul Fleming
@kwamke,在print语句后加上逗号对我有用。你能解释一下为什么逗号可以防止新行被写入吗?谢谢。 - teamg
我在这里找到了解释。https://www.afternerd.com/blog/how-to-print-without-a-newline-in-python/ - teamg

6

将for循环中的第一行更改为:

line = line.rstrip().replace("查找字符串", "替换字符串")


请解释一下为什么要进行负投票。这种方法可以解决换行符的问题(虽然我无法重现 Ctrl-M 的问题,因此无法对其发表意见)。 - kmote
1
这个答案的问题在于它本质上是一个“hack”,而不是避免在第一次添加时添加额外的换行符(在你发布答案之前一年已经有其他答案涵盖了这一点!)。这可能就是为什么你会被踩的原因。 - Lightness Races in Orbit

1
由于每个迭代的打印语句都以换行符结尾,因此在行之间会得到空白行。
为了解决这个问题,您可以在打印时使用strip。
import fileinput
def fixFile(fileName):
  for line in fileinput.FileInput(fileName, inplace=1):
    line = line.replace("findStr", "replaceStr")
    print line.strip()

现在,您可以看到空白行已被剥离。

这也会删除缩进,但这可能不是所期望的。相反,请使用 rstrip() :) - mjd2

0

关于Python 3.4的更新,您只需使用以下命令:

print(line, end = '')

为了避免插入新行,请使用

标签。


13
Python 4.3?😊 - errata
尽管我很喜欢在原始答案中看到4.3,但我将其编辑为3.4以避免混淆。 - Charles L.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接