【问题标题】:Deleting a line from a file in Python在 Python 中从文件中删除一行
【发布时间】:2011-05-10 09:14:43
【问题描述】:

我正在尝试删除包含特定字符串的特定行。

我有一个名为 numbers.txt 的文件,其内容如下:

彼得
汤姆
汤姆1

我要删除的是文件中的那个tom,所以我做了这个函数:

def deleteLine():
fn = 'numbers.txt'
f = open(fn)
output = []
for line in f:
    if not "tom" in line:
        output.append(line)
f.close()
f = open(fn, 'w')
f.writelines(output)
f.close()

输出是:

彼得

如您所见,问题在于函数删除tomtom1,但我不想删除tom1。我只想删除 tom。这是我想要的输出:

彼得
汤姆1

有什么想法可以改变函数以使其正确吗?

【问题讨论】:

标签: python string file line


【解决方案1】:

换行:

    if not "tom" in line:

到:

    if "tom" != line.strip():

【讨论】:

  • 你不应该需要从文件obj中删除一行迭代。
  • Mac 上的 Python 2.5.4 在迭代 fileobj 时不会剥离新行字符,因此如果要与字符串进行比较,则需要剥离它。此外,在空格以某种方式设法在行尾偷偷摸摸并且代码没有处理它之后,我还看到了许多错误。
  • 好奇怪,win 和 linux 似乎都毫无怨言地剥离了,谢谢你教我一些东西 :)
  • @Jakob Bowyer:为了完整起见,这不是真的。在 linux 或 windows 中,行也不会被剥离。从 python 中的文件对象读取的任何行都带有换行符,无论平台如何
【解决方案2】:

那是因为

if not "tom" in line

检查tom 是否不是当前line 的子字符串。但在tom1 中,tom 子串。因此,它被删除了。

您可能想要以下之一:

if not "tom\n"==line # checks for complete (un)identity
if "tom\n" != line # checks for complete (un)identity, classical way
if not "tom"==line.strip() # first removes surrounding whitespace from `line`

【讨论】:

  • 在直接遍历 fileobj 时,您不需要删除一行,它应该已经为您提供了已删除的字符串。
  • @Jakob Bowyer:不,那是错误的。您确实需要在遍历fileobj 时删除该行。它将产生 带有换行符的行,因此如果您不剥离字符串,则不会比较相等。
【解决方案3】:

只是为了好玩,这里有两条线来做。

lines = filter(lambda x:x[0:-1]!="tom", open("names.txt", "r"))
open("names.txt", "w").write("".join(lines))

挑战:有人为此发布了一条线。

您还可以使用 fileinput 模块来获得可以说是最易读的结果:

import fileinput
for l in fileinput.input("names.txt", inplace=1):
    if l != "tom\n": print l[:-1]

【讨论】:

  • open("names_out.txt", "w").write("\n".join(line for line in open("names.txt", "r") if line[:-1] != "tom"))。不过,我想当两个文件名相同时它不会起作用。
  • 哎呀。应该是"".join 而不是上面的"\n".join。而且我猜想就地转换也可以使用fileinput 模块来实现。
  • 可能是subprocess.Popen("sed -i '' -e'/^tom$/d' numbers.txt") 之类的?
【解决方案4】:

您可以使用正则表达式。

import re
if not re.match("^tom$", line):
    output.append(line)

$ 表示字符串的结尾。

【讨论】:

  • 如果你沿着这条路走,你还需要匹配字符串的开头,即re.match("^tom$", line)
  • @tzot,你没有修复它的内疚不亚于 riza。
  • @ArtOfWarfare,你犯了错误的假设。 从不认为他应该编辑它,因为他使用了.match而不是.search;我的陈述是对 riza 的评论而不是编辑的简单“如果-那么”轻推。
【解决方案5】:

我是编程和 python 的新手(几个月)...这是我的解决方案:

import fileinput

c = 0 # counter
for line in fileinput.input("korrer.csv", inplace=True, mode="rb"):
    # the line I want to delete
    if c == 3: 
        c += 1
        pass
    else:
        line = line.replace("\n", "")
        print line
        c +=1

我确信有一个更简单的方法,只是它是一个想法。 (我的英文不太好看!!)

【讨论】:

    猜你喜欢
    • 2023-02-08
    • 2018-09-21
    • 2014-12-14
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 2022-01-21
    相关资源
    最近更新 更多