如何使用 Python 删除文本文件中的特定行?

2024-11-28 08:37:00
admin
原创
10
摘要:问题描述:假设我有一个全是昵称的文本文件。如何使用 Python 从此文件中删除特定昵称?解决方案 1:首先,打开文件并从文件中获取所有行。然后以写入模式重新打开文件并写回所有行,但要删除的行除外:with open("yourfile.txt", "r") as f:...

问题描述:

假设我有一个全是昵称的文本文件。如何使用 Python 从此文件中删除特定昵称?


解决方案 1:

首先,打开文件并从文件中获取所有行。然后以写入模式重新打开文件并写回所有行,但要删除的行除外:

with open("yourfile.txt", "r") as f:
    lines = f.readlines()
with open("yourfile.txt", "w") as f:
    for line in lines:
        if line.strip("
") != "nickname_to_delete":
            f.write(line)

您需要`strip("
")在比较中使用换行符,因为如果您的文件没有以换行符结尾,那么最后一个line`也不会以换行符结尾。

解决方案 2:

仅用单开即可解决此问题:

with open("target.txt", "r+") as f:
    d = f.readlines()
    f.seek(0)
    for i in d:
        if i != "line you want to remove...":
            f.write(i)
    f.truncate()

该解决方案以 r/w 模式(“r+”)打开文件,并使用 seek 重置 f 指针,然后截断以删除上次写入后的所有内容。

解决方案 3:

我认为,最好和最快的选择是在其他地方重写文件,而不是将所有内容存储在列表中并重新打开文件进行写入。

with open("yourfile.txt", "r") as file_input:
    with open("newfile.txt", "w") as output: 
        for line in file_input:
            if line.strip("
") != "nickname_to_delete":
                output.write(line)

就是这样!只需一个循环,您就可以完成相同的操作。这样会快得多。

解决方案 4:

这是来自@Lother的答案的“分叉” (应该被视为正确答案)。

对于这样的文件:

$ cat file.txt 
1: october rust
2: november rain
3: december snow

此代码:

#!/usr/bin/python3.4

with open("file.txt","r+") as f:
    new_f = f.readlines()
    f.seek(0)
    for line in new_f:
        if "snow" not in line:
            f.write(line)
    f.truncate()

改进:

  • with open,它放弃了使用f.close()

  • 更清晰地if/else评估当前行中是否存在字符串

解决方案 5:

在第一遍读取行并在第二遍进行更改(删除特定行)的问题是,如果文件大小很大,您将耗尽 RAM。相反,更好的方法是逐行读取行,并将它们写入单独的文件,删除不需要的行。我已经对 12-50 GB 的文件运行了这种方法,RAM 使用率几乎保持不变。只有 CPU 周期显示正在进行的处理。

解决方案 6:

尚未提出一个简单的解决方案:

with open( file_of_nicknames, "r+" ) as f:
    lines = f.readlines()           # Get a list of all lines
    f.seek(0)                       # Reset the file to the beginning

    idx = lines.index("Nickname
") # Don't forget the '
'
    lines.pop( idx )                # Remove the corresponding index

    f.truncate()                    # Stop processing now
                                    # because len(file_lines) > len( lines ) 
    f.writelines( lines )           # write back

受到先前答案的启发

解决方案 7:

如果您使用 Linux,则可以尝试以下方法。

假设您有一个名为的文本文件animal.txt

$ cat animal.txt  
dog
pig
cat 
monkey         
elephant  

删除第一行:

>>> import subprocess
>>> subprocess.call(['sed','-i','/.*dog.*/d','animal.txt']) 

然后

$ cat animal.txt
pig
cat
monkey
elephant

解决方案 8:

我喜欢这个答案中解释的 fileinput 方法:
从文本文件中删除一行(python)

比如说,我有一个文件,里面有空行,我想删除空行,下面是我解决问题的方法:

import fileinput
import sys
for line_number, line in enumerate(fileinput.input('file1.txt', inplace=1)):
    if len(line) > 1:
            sys.stdout.write(line)

注意:我这里空行的长度为 1

解决方案 9:

可能你已经得到了正确的答案,但这是我的答案。我没有使用列表来收集未过滤的数据(什么readlines()方法可以做到),而是使用了两个文件。一个用于保存主要数据,第二个用于在删除特定字符串时过滤数据。以下是代码:

main_file = open('data_base.txt').read()    # your main dataBase file
filter_file = open('filter_base.txt', 'w')
filter_file.write(main_file)
filter_file.close()
main_file = open('data_base.txt', 'w')
for line in open('filter_base'):
    if 'your data to delete' not in line:    # remove a specific string
        main_file.write(line)                # put all strings back to your db except deleted
    else: pass
main_file.close()

希望你会觉得这有用!:)

解决方案 10:

我认为,如果您将文件读入列表,然后执行迭代列表以查找要删除的昵称。您可以更高效地完成此操作而无需创建其他文件,但您必须将结果写回源文件。

我可能会这样做:

import, os, csv # and other imports you need
nicknames_to_delete = ['Nick', 'Stephen', 'Mark']

我假设nicknames.csv包含如下数据:

Nick
Maria
James
Chris
Mario
Stephen
Isabella
Ahmed
Julia
Mark
...

然后将文件加载到列表中:

 nicknames = None
 with open("nicknames.csv") as sourceFile:
     nicknames = sourceFile.read().splitlines()

接下来,迭代列表以匹配要删除的输入:

for nick in nicknames_to_delete:
     try:
         if nick in nicknames:
             nicknames.pop(nicknames.index(nick))
         else:
             print(nick + " is not found in the file")
     except ValueError:
         pass

最后将结果写回文件:

with open("nicknames.csv", "a") as nicknamesFile:
    nicknamesFile.seek(0)
    nicknamesFile.truncate()
    nicknamesWriter = csv.writer(nicknamesFile)
    for name in nicknames:
        nicknamesWriter.writeRow([str(name)])
nicknamesFile.close()

解决方案 11:

一般来说,你不能;你必须重新写入整个文件(至少从更改点到结尾)。

在某些特定情况下,你可以做得更好 -

如果所有数据元素的长度都相同且没有特定的顺序,并且您知道要删除的数据元素的偏移量,则可以将最后一项复制到要删除的数据上,并在最后一项之前截断文件;

或者您可以用“这是坏数据,跳过它”值覆盖数据块,或者在保存的数据元素中保留“此项已被删除”标志,这样您就可以将其标记为已删除而无需修改文件。

对于短文档(小于 100 KB?)来说,这可能有点过度了。

解决方案 12:

我喜欢这种使用 fileinput 和“inplace”方法的方法:

import fileinput
for line in fileinput.input(fname, inplace =1):
    line = line.strip()
    if not 'UnwantedWord' in line:
        print(line)

它比其他答案少一点冗长,而且速度足够快

解决方案 13:

将文件行保存在列表中,然后从列表中删除要删除的行,并将剩余的行写入新文件

with open("file_name.txt", "r") as f:
    lines = f.readlines() 
    lines.remove("Line you want to delete
")
    with open("new_file.txt", "w") as new_f:
        for line in lines:        
            new_f.write(line)

解决方案 14:

这里有一些从文件中删除一行或多行的其他方法:

src_file = zzzz.txt
f = open(src_file, "r")
contents = f.readlines()
f.close()

contents.pop(idx) # remove the line item from list, by line number, starts from 0

f = open(src_file, "w")
contents = "".join(contents)
f.write(contents)
f.close()

解决方案 15:

您可以使用re图书馆

假设您能够加载完整的 txt 文件。然后您定义不需要的昵称列表,并用空字符串“”替换它们。

# Delete unwanted characters
import re

# Read, then decode for py2 compat.
path_to_file = 'data/nicknames.txt'
text = open(path_to_file, 'rb').read().decode(encoding='utf-8')

# Define unwanted nicknames and substitute them
unwanted_nickname_list = ['SourDough']
text = re.sub("|".join(unwanted_nickname_list), "", text)

解决方案 16:

  src_file = "lazy_gameinfo/ownedvehicle.csv"
  f = open(src_file, "r")
  contents = f.readlines()
  f.close()

  contents.pop(index)

  f = open(src_file , "w")
  contents = "".join(contents)
  #print(contents)
  f.write(contents)
  f.close()

解决方案 17:

您是否想从文件中删除特定行,因此请使用此简短的代码片段,您可以轻松删除任何带有句子或前缀(符号)的行。

with open("file_name.txt", "r") as f:
lines = f.readlines() 
with open("new_file.txt", "w") as new_f:
    for line in lines:
        if not line.startswith("write any sentence or symbol to remove line"):
            new_f.write(line)

解决方案 18:

这是我发现的最简单的方法,对我有用

with open('/content/punch_data.txt') as punch_file : #opening the file in the reading mode
for line in punch_file:
  if line.isspace():
    continue
  else:
    print(line)

解决方案 19:

要按行号删除文件的特​​定行:

将变量filenameline_to_delete替换为您要删除的文件名和行号。

filename = 'foo.txt'
line_to_delete = 3
initial_line = 1
file_lines = {}

with open(filename) as f:
    content = f.readlines() 

for line in content:
    file_lines[initial_line] = line.strip()
    initial_line += 1

f = open(filename, "w")
for line_number, line_content in file_lines.items():
    if line_number != line_to_delete:
        f.write('{}
'.format(line_content))

f.close()
print('Deleted line: {}'.format(line_to_delete))

示例输出

Deleted line: 3

解决方案 20:

获取文件内容,按换行符将其拆分为元组。然后,访问元组的行号,连接结果元组,并覆盖到文件。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   657  
  如何借鉴华为IPD体系优化企业研发?在当今竞争激烈的市场环境中,企业要想保持技术领先和产品竞争力,必须拥有一套高效且严谨的研发管理体系。华为作为全球领先的ICT解决方案提供商,其集成产品开发(IPD, Integrated Product Development)体系与质量管理体系(如ISO 9000系列)的融合实践,...
IPD项目管理   15  
  IPD流程图的7种经典绘制方法详解在产品开发领域,集成产品开发(Integrated Product Development,简称IPD)流程被广泛应用,以提高产品开发的效率和质量。IPD流程图作为这一流程的可视化工具,其绘制方法至关重要。本文将详细介绍七种经典的IPD流程图绘制方法,帮助项目管理人员和团队更好地理解和...
IPD研发管理体系   18  
  IPD流程:企业创新管理的核心引擎在当今快速变化的市场环境中,企业要想持续保持竞争力,就必须不断进行创新。而IPD(Integrated Product Development,集成产品开发)流程作为一种先进的产品开发管理模式,正逐渐成为众多企业提升创新能力、加速产品上市速度、降低开发成本的重要选择。本文将深入探讨IP...
IPD管理   18  
  IPD流程与传统产品开发流程的概述在产品开发领域,企业不断寻求高效、系统的管理方法以确保产品能够顺利从概念转化为市场成功的产品。集成产品开发(Integrated Product Development,简称IPD)流程与传统产品开发流程是两种截然不同的管理理念和方法。传统产品开发流程往往以职能部门为核心,各部门按顺序...
IPD流程中PDCP是什么意思   16  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用