我正在尝试创建一个脚本,该脚本合并目录中的所有文件,然后删除输出文件中不需要的行。我想删除的行包含相同的字符串模式,我想删除除第一行之外的所有行(这也是文件中的第一行)。以下是我尝试这样做的方法:
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
开头的所有行,并且不会删除第一行...
有没有人有这个优雅的解决方案?
答案 0 :(得分:0)
for line in file
遍历文件的实际内容,而不是行号。因为即使空字符串大于0,你的第一个条件永远不会是真的,而第二个条件总是如此(当.startswith(..)
也是真的时......)。
对于列表中第一项的特殊处理,有很多习惯用法,这是一个非常直接的习惯,只需对代码进行最少的调整:
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)
答案 1 :(得分:0)
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)
答案 2 :(得分:0)
首先,打开文件:
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()
您可以逐个追加文件。学习 Python Pandas库。