如何删除包含特定字符的文件中除第一行以外的所有行?
How to remove all lines in a file containing a specific character except for the first?
我正在尝试制作一个脚本,将所有文件合并到一个目录中,然后删除输出文件中不需要的行。我要删除的行包含相同的字符串模式,我想删除除第一行以外的所有行(这也是文件中的第一行)。以下是我尝试这样做的方式:
import glob
# Merge all output files into one file
read_files = glob.glob('/home/user/Results/Script_tests/TestResults/*.output')
with open('MergedOutput.txt', 'r+b') as outfile:
for file in read_files:
with open(file, 'r+b') as infile:
outfile.write(infile.read())
print 'Files merged.'
# Remove header rows except from row 1
final_output = open('FinalMergedOutput.txt', 'r+b')
with open('MergedOutput.txt', 'r+b') as file:
for line in file:
if line == 0 and line.startswith('File'):
final_output.write(line)
elif line > 0 and not line.startswith('File'):
final_output.write(line)
print 'Headers removed except on line 1.'
合并部分工作得很好,除了某些行似乎是在 FinalMergedOutput.txt
中复制的。然而,删除行会删除所有以 File
开头的行,并且不会保留第一个...
有没有人对此有一个优雅的解决方案?
for line in file
迭代文件的实际内容,而不是行号。由于即使是空字符串也大于 0,因此您的第一个条件永远不会为真,而第二个条件始终为真(当 .startswith(..)
也为真时...)。
有很多 to 的习语用于列表中第一项的特殊处理,这是一个非常简单的方法,对您的代码进行了最少的调整:
for line_num,line in enumerate(file):
if line_num == 0 and line.startswith('File'):
final_output.write(line)
elif line_num > 0 and not line.startswith('File'):
final_output.write(line)
line == 0
将不起作用。 line
是包含该行文本的字符串,因此它永远不会为零。相反,请继续跟踪 行号 ,例如使用 enumerate
:
for lineNumber, line in enumerate(file):
if lineNumber == 0 and line.startswith('File'):
final_output.write(line)
elif lineNumber > 0 and not line.startswith('File'):
final_output.write(line)
您还可以简化该检查:
for lineNumber, line in enumerate(file):
if lineNumber == 0 or not line.startswith('File'):
final_output.write(line)
首先,打开文件:
f = open("yourfile.txt","r")
接下来,从文件中获取所有行:
lines = f.readlines()
现在您可以关闭文件了:
f.close()
并以写入模式重新打开它:
f = open("yourfile.txt","w")
然后,把你的台词写回去,除了你想删除的台词。您可能希望将“\n”更改为文件结尾使用的任何行。
for line in lines:
if line!="file_line_to_delete"+"\n":
f.write(line)
最后,再次关闭文件。
f.close()
您可以一个接一个地追加文件。学习PythonPandas图书馆.
我正在尝试制作一个脚本,将所有文件合并到一个目录中,然后删除输出文件中不需要的行。我要删除的行包含相同的字符串模式,我想删除除第一行以外的所有行(这也是文件中的第一行)。以下是我尝试这样做的方式:
import glob
# Merge all output files into one file
read_files = glob.glob('/home/user/Results/Script_tests/TestResults/*.output')
with open('MergedOutput.txt', 'r+b') as outfile:
for file in read_files:
with open(file, 'r+b') as infile:
outfile.write(infile.read())
print 'Files merged.'
# Remove header rows except from row 1
final_output = open('FinalMergedOutput.txt', 'r+b')
with open('MergedOutput.txt', 'r+b') as file:
for line in file:
if line == 0 and line.startswith('File'):
final_output.write(line)
elif line > 0 and not line.startswith('File'):
final_output.write(line)
print 'Headers removed except on line 1.'
合并部分工作得很好,除了某些行似乎是在 FinalMergedOutput.txt
中复制的。然而,删除行会删除所有以 File
开头的行,并且不会保留第一个...
有没有人对此有一个优雅的解决方案?
for line in file
迭代文件的实际内容,而不是行号。由于即使是空字符串也大于 0,因此您的第一个条件永远不会为真,而第二个条件始终为真(当 .startswith(..)
也为真时...)。
有很多 to 的习语用于列表中第一项的特殊处理,这是一个非常简单的方法,对您的代码进行了最少的调整:
for line_num,line in enumerate(file):
if line_num == 0 and line.startswith('File'):
final_output.write(line)
elif line_num > 0 and not line.startswith('File'):
final_output.write(line)
line == 0
将不起作用。 line
是包含该行文本的字符串,因此它永远不会为零。相反,请继续跟踪 行号 ,例如使用 enumerate
:
for lineNumber, line in enumerate(file):
if lineNumber == 0 and line.startswith('File'):
final_output.write(line)
elif lineNumber > 0 and not line.startswith('File'):
final_output.write(line)
您还可以简化该检查:
for lineNumber, line in enumerate(file):
if lineNumber == 0 or not line.startswith('File'):
final_output.write(line)
首先,打开文件:
f = open("yourfile.txt","r")
接下来,从文件中获取所有行:
lines = f.readlines()
现在您可以关闭文件了:
f.close()
并以写入模式重新打开它:
f = open("yourfile.txt","w")
然后,把你的台词写回去,除了你想删除的台词。您可能希望将“\n”更改为文件结尾使用的任何行。
for line in lines:
if line!="file_line_to_delete"+"\n":
f.write(line)
最后,再次关闭文件。
f.close()
您可以一个接一个地追加文件。学习PythonPandas图书馆.