字符串替换并保存到新文件(Python v2.7)
我试图用一个空格替换文件中某一格式的所有行,即用“”替换数字/数字/数字(如日期)和数字:数字(如时间)行。我想从旧文件中读取,然后将删除的版本另存为新文件 这是迄今为止我所掌握的代码(我知道它已经过时了): 谢谢你的帮助,字符串替换并保存到新文件(Python v2.7),python,Python,我试图用一个空格替换文件中某一格式的所有行,即用“”替换数字/数字/数字(如日期)和数字:数字(如时间)行。我想从旧文件中读取,然后将删除的版本另存为新文件 这是迄今为止我所掌握的代码(我知道它已经过时了): 谢谢你的帮助, Ben首先,存在一些缩进问题,其中循环的是无缘无故缩进的。第二,只要你读到你所查找的文件的末尾,就没有更多的行要读了。最后,with命令允许您打开一个文件并声明其变量名,并允许它在错误或读取到最后时关闭,而不必担心手动关闭它 然而,要执行实际逻辑,您可能需要使用。您可以使用
Ben首先,存在一些缩进问题,其中循环的
是无缘无故缩进的。第二,只要你读到你所查找的文件的末尾,就没有更多的行要读了。最后,with
命令允许您打开一个文件并声明其变量名,并允许它在错误或读取到最后时关闭,而不必担心手动关闭它
然而,要执行实际逻辑,您可能需要使用。您可以使用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)
如果你只想在行首匹配,可能会是一个更好的选择
在这里,我们用两个文件声明一个块,循环遍历旧的\u文件
,清理每一行并写入新的\u文件
。一旦到达旧\u文件的末尾
,所有文件都将完全关闭。如果找不到任何一个文件,或者发生错误,with块将捕获这些文件并很好地释放所有文件
我试图用一个空格替换文件中某一格式的所有行,即用“”替换数字/数字/数字(如日期)和数字:数字(如时间)行
不能使用str.replace
来匹配模式或格式,只能使用文字字符串
要匹配模式,需要某种解析器。对于这样的模式,标准库as中内置的正则表达式引擎已经足够强大了……但是您需要学习如何为您的模式编写正则表达式。如果你已经知道了基础知识,那么参考文档和文档是非常棒的;如果没有,您应该在其他地方搜索教程
不管怎样,下面是你如何做到这一点的(一路上解决一些其他问题,其中大部分由乐高冲锋队解释):
另外,请注意,我在第二个sub
中使用了cleaned_line
;只需再次使用行
,就像在原始代码中一样,意味着我们将丢失第一次替换的结果
如果不知道你的问题的确切定义,我不能保证这正是你想要的。是否要将包含图案编号/编号/编号的所有行留空,将除该图案以外的所有行留空,仅将该图案留空,并保留该行的其余部分?通过re
,所有这些事情都是可行的,而且非常简单,但它们的做法都有点不同
如果您想变得更复杂一些,可以使用一个re.sub
表达式一次将所有匹配行替换为空行,而不是一次迭代一行。这意味着regexp要比Python代码稍微复杂一些,这意味着中等大小的文件可能会有更好的性能,而大型文件的性能可能会更差(还有一个上限),等等。如果您自己无法找到如何编写适当的表达式,并且没有性能瓶颈需要解决,我会坚持使用显式循环。更改旧的\u文件。关闭到旧的\u文件。关闭()
对于新的\u文件,您不需要在for循环中使用旧的\u文件。readlines():
。您可以只对旧文件中的行执行:
老实说,在我阅读您的代码之前,我甚至不知道读取行
甚至存在。@ShashankGupta实际上,在该代码中,读取行
(或对于文件中的行
)不会做任何事情,因为文件.read()
调用一直到文件末尾。这意味着没有什么可以重复。@ShashankGupta:有一半的教程教人们如何使用阅读行。我不知道为什么。如果由我决定,readlines
如果没有hint
参数,那么它在3.x中就会被废弃,而不仅仅是在文件对象文档(没有人知道如何在3.x中找到)中强调它是不必要的
除了性能问题之外,没有在此处添加任何内容;只需对旧文件中的行执行:
。更重要的是,我不认为这实际上解决了OP的问题。根据他的描述,他希望将所有行与格式number/number/number匹配,而不是将所有行与文本字符串%/%/%
匹配,这是他不知道怎么做的部分。@abarnert更新为包含数字匹配逻辑。@ShashankGupta:Python中使用with
作为一对匹配的输入和输出文件是一个非常常见和公认的习惯用法。事实上,这是将multi-contextwith
语句添加到语言中的主要原因。@ShashankGupta我正在同时使用这两个文件做。为什么它们不应该在一起呢?我希望完全清空所有包含number/number/number或number:number格式字符串的行。我相信我能从你和乐高冲锋队的答案中找到答案。感谢您的快速回复。@abarnert谢谢您的回答!
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)
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)