我正在尝试用文件中的空格替换某个格式的所有行,即用“”替换数字/数字/数字(如日期)和数字:数字(如时间)。我想从旧文件中读取,然后将清理后的版本保存为新文件。
这是我到目前为止的代码(我知道它已经过时了):
old_file = open("old_text.txt", "r")
new_file = open("new_text.txt", "w")
print (old_file.read())
for line in old_file.readlines():
cleaned_line = line.replace("%/%/%", "")
cleaned_line = line.replace("%:%", "")
new_file.write(cleaned_line)
old_file.close
new_file.close
感谢您的帮助, 本
答案 0 :(得分:1)
我正在尝试用文件中的空格替换某个格式的所有行,即用“”替换一行数字/数字/数字(如日期)和数字:数字(如时间)。
您无法使用str.replace
来匹配模式或格式,只能使用文字字符串。
要匹配模式,您需要某种解析器。对于这样的模式,标准库中内置的正则表达式引擎re
足够强大......但是您需要学习如何为模式编写正则表达式。如果您已经了解基础知识,那么参考文档和Regular Expression HOWTO就很棒;如果没有,你应该在其他地方搜索教程。
无论如何,这就是你如何做到这一点(在此过程中修复其他一些事情,其中大部分是由Lego Stormtroopr解释的):
import re
with open("old_text.txt") as old_file, open("new_text.txt", "w") as new_file:
for line in old_file:
cleaned_line = re.sub(r'\d+/\d+/\d+', '', line)
cleaned_line = re.sub(r'\d+:\d+', '', cleaned_line)
new_file.write(cleaned_line)
另请注意,我在第二个cleaned_line
中使用了sub
;再次使用line
,就像在原始代码中一样,意味着我们会丢失第一次替换的结果。
在不知道问题的确切定义的情况下,我不能保证这完全符合您的要求。是否要删除包含模式编号/编号/编号的所有行,删除所有但该模式的行,将该模式删空并留下其余的一线?所有这些事情都是可行的,并且非常简单,只有re
,但它们都完全不同。
如果你想变得有点棘手,可以使用单个re.sub
表达式一次用空行替换所有匹配行,而不是一次迭代一行。这意味着一个稍微复杂的正则表达式与稍微简单的Python代码相比,它意味着对于中型文件可能性能更好,但对于大型文件来说性能更差(并且上限),等等。如果你不知道如何自己编写适当的表达式,并且没有修复的性能瓶颈,我会坚持使用显式循环。
答案 1 :(得分:0)
首先,存在一些缩进问题,其中for
循环无缘无故缩进。其次,只要你read
找到了你已经找到的文件,那么就没有更多的行可供阅读。最后,with
命令允许您打开文件并声明其变量名称,并允许它因错误或读取而关闭,而不必担心手动关闭它。
但是,要执行实际逻辑,您可能希望使用regular expression。您可以使用re.search()
查找模式
\d+:\d+
任意数量的数字,冒号和任意数量的数字\d+\/\d+\/d+
三个任意数量的数字,其间有/
字面值。您想要的代码更接近于此:
import re
with open("old_text.txt", "r") as oldfile, open("new_text.txt", "w") as new_file:
for line in old_file:
# This will match if this pattern is anywhere in the line
if re.search("\d+:\d+", line) is not None:
line = ""
# This will match if this pattern is anywhere in the line
if re.search("\d+\/\d+\/d+", line) is not None:
line = ""
new_file.write(line)
如果您只想在该行的开头匹配,re.match()
可能是更好的选择。
这里我们用两个文件声明一个块,遍历old_file
,清理每一行并写入new_file
。到达old_file
的末尾后,所有文件都将完全关闭。如果找不到任何一个文件,或者发生错误,with块会捕获这些文件并很好地释放所有文件。