如何使用 Python 删除文本文件中的特定行?
- 2024-11-28 08:37:00
- admin 原创
- 10
问题描述:
假设我有一个全是昵称的文本文件。如何使用 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:
要按行号删除文件的特定行:
将变量filename和line_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:
获取文件内容,按换行符将其拆分为元组。然后,访问元组的行号,连接结果元组,并覆盖到文件。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件