Answers:
首先,打开文件并从文件中获取所有行。然后以写模式重新打开文件并写回您的行,但要删除的行除外:
with open("yourfile.txt", "r") as f:
lines = f.readlines()
with open("yourfile.txt", "w") as f:
for line in lines:
if line.strip("\n") != "nickname_to_delete":
f.write(line)
您需要strip("\n")
在比较中使用换行符,因为如果文件不以换行符结尾,则最后一个line
也不行。
仅需一次打开即可解决此问题:
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指针,然后在上次写入后截断以删除所有内容。
for
循环中遇到错误,最终将得到部分覆盖的文件,其中重复的行或行的一半被截断。你可能想f.truncate()
后立即f.seek(0)
代替。这样,如果遇到错误,您将最终得到不完整的文件。但是真正的解决方案(如果有磁盘空间)是输出到一个临时文件,然后在一切成功之后使用os.replace()
或pathlib.Path(temp_filename).replace(original_filename)
将其与原始文件交换。
i.strip('\n') != "line you want to remove..."
按照接受的答案中的说明添加,这样可以完全解决我的问题。因为i
对我什么都没做
在我看来,最好和最快的选择不是将所有内容存储在列表中并重新打开文件以将其写入,而是将文件重新写入其他位置。
with open("yourfile.txt", "r") as input:
with open("newfile.txt", "w") as output:
for line in input:
if line.strip("\n") != "nickname_to_delete":
output.write(line)
而已!在一个循环中,只有一个循环您可以执行相同的操作。它将更快。
(output.write(line) for line in input if line!="nickname_to_delete"+"\n")
subprocess.call(['mv', 'newfile.txt', 'yourfile.txt'])
os.replace
(python v 3.3中的新增功能)比跨系统调用更具跨平台性mv
。
这是@Lother答案的“叉子” (我认为应该认为是正确的答案)。
对于这样的文件:
$ cat file.txt
1: october rust
2: november rain
3: december snow
Lother解决方案中的这个fork可以正常工作:
#!/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
评估当前行中是否不存在字符串我喜欢此答案中所述的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
如果使用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
我认为,如果您将文件读入列表,则可以在列表上进行遍历以查找要删除的昵称。您可以高效地执行此操作,而无需创建其他文件,但是必须将结果写回到源文件中。
这是我可能的方法:
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()
可能您已经得到了正确的答案,但这是我的。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()
希望您会发现这个有用!:)
将文件行保存在列表中,然后从列表中删除要删除的行,并将其余行写入新文件
with open("file_name.txt", "r") as f:
lines = f.readlines()
lines.remove("Line you want to delete\n")
with open("new_file.txt", "w") as new_f:
for line in lines:
new_f.write(line)
您可以使用
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)
通过文件的行号删除文件的特定行:
将变量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('{}\n'.format(line_content))
f.close()
print('Deleted line: {}'.format(line_to_delete))
输出示例:
Deleted line: 3
for nb, line in enumerate(f.readlines())
取文件内容,用换行符将其拆分为元组。然后,访问您的元组的行号,加入结果元组,然后覆盖该文件。
tuple(f.read().split('\n'))
?(2)“访问元组的行号”和“加入结果元组”听起来很神秘;实际的Python代码可能更容易理解。
fileinput
按@ jf-sebastian的描述在此处。似乎可以通过一个临时文件逐行工作,所有这些操作都使用简单的for
语法。