Python:在特定字符后修改文本文件
我正在用python对文本文件进行一些操作。但有一件事我还没有找到解决办法。我希望这里有人能帮助我 在文本文件的每一行中,我都有一个单词Python:在特定字符后修改文本文件,python,Python,我正在用python对文本文件进行一些操作。但有一件事我还没有找到解决办法。我希望这里有人能帮助我 在文本文件的每一行中,我都有一个单词order,然后是一个由、和数字组成的字符串 现在我想删除单词order以及该行后面的所有内容,但我不知道如何删除。文件中说明顺序的位置总是不同的,因此我不能指向某个位置,然后删除所有内容。逐行遍历文件(我假设您已经这样做了),然后使用字符串。查找: >>> import string >>> x = 'helloORDERm
order
,然后是一个由、
和数字组成的字符串
现在我想删除单词
order
以及该行后面的所有内容,但我不知道如何删除。文件中说明顺序的位置总是不同的,因此我不能指向某个位置,然后删除所有内容。逐行遍历文件(我假设您已经这样做了),然后使用字符串。查找:
>>> import string
>>> x = 'helloORDERme'
>>> string.find(x,"ORDER")
5
>>> x[:string.find(x,"ORDER")]
'hello'
或者如果你真的需要知道这一点:
import string
with open('myfile', 'rU') as f:
for line in f:
print line[:string.find(line,"order")]
我将把写更新后的值作为询问者的练习
lines = "hello1OrderABC\nhello2OrderDEF".splitlines()
for line in lines:
print line[:line.find("Order")]
------
hello1
hello2
第一行创建一个行列表['hello1OrderABC','hello2OrderDEF']。其余的部分将遍历此列表,并打印出所有内容,直到“Order”一词。做您想做的事情非常容易,因为您只删除部分文本,因此您可以使用“r+”模式在读取的同一文件中重写
with open(filename,'r+') as fr,open(filename,'r+') as fw:
for line in fr:
x = line.find('order')
fw.write(line if x==-1
else line[0:x]+'\n' if '\n' in line
else line[0:x])
fw.truncate()
如果您的文件不是太大,因此可以完全读取并保存在RAM中,那么下面是使用正则表达式的另一种方法:
import re
r = re.compile('(.*?)(?:order.*?$|\Z)',
re.MULTILINE|re.DOTALL)
with open(filename,'r+') as f:
x = f.read()
f.seek(0,0)
f.write(''.join(r.findall(x)))
f.truncate()
谢谢,但那到底在干什么?x定义文本和字符串。find在文本中查找并给出位置,对吗?然后?x[a:b]从索引'a'到'b'取'x'的切片,但不包括'b'。省略'a'(即x[:b])将从'x'的开始到'b'的切片。因此,在您的解决方案中,它将从“x”的开头到索引5(字符0,1,2,3,4)进行切片。好的,在我使用这个:S之后,我的文件是完全空的。如果x总是变化,或者我误解了这一点,我如何定义x?该代码只是如何使用string.find的一个示例。我假设您能够根据自己迭代文件的方式对其进行调整。我已经添加了一个如何做的例子。我从eyquem那里得到了如何做的答案,但我很好奇也能用你的方式来做。我用:f.write(line[:string.find(line,“order”)])编写文件,我想删除的信息不见了,但如果我像这样运行,所有行都放在一起,我无法区分它们。也许我必须更具体一些。“顺序”这个词是在中间的某个地方,之前和之后的字符串是变化的…或者也许我现在只是一个精神障碍,应该做一个午餐休息。在我的例子中,“秩序”这个词在中间。例如,第1行(hello1OrderABC):“hello1”在“Order”之前,“ABC”在“Order”之后。因此,输出是“Order”,在本例中是“hello1”。这两种方法都可以正常工作!谢谢你能解释一下这段代码实际上做了什么吗?我准备好解释一些通过阅读文档无法理解的要点。您是否阅读了字符串上的文档方法find()
?您是否阅读了关于<代码>的声明?在第一段代码中,我认为唯一需要解释的一点是,只有当换行符\n
出现在行中时,行[0:x]+'\n'
才会写入文件中:如果文件的最后一个字符不是\n
并且最后一行不包含“order”,则写入行[0:x]
而不是最后一行的行[0:x]+'\n'
不会添加尚未出现的新行。'r+'
是一种可以读取和覆盖文件的模式。模式'a+“
与之类似,但有一个特点:每次在'a+'
模式下打开的文件中写入时,文件的指针都会在写入之前移动到文件的末尾,以防止覆盖文件中的数据。在您的情况下,您希望覆盖,因此需要模式'r+'
。在您的情况下,这很容易,因为您只删除字符。当在文件中就地执行变量长度的覆盖时,处理必须更加精细,并且需要查找
,告诉
,截断
。是的,我读到了这方面的内容,并且您准确地解释了我想知道的内容!非常感谢<代码中的code>f
,fr
,fw
是文件的指针,也是文件的处理程序。我们可以将它们的心理表征为一种触笔,置于文件所包含的物理位序列之上。静止时,手写笔放在两个字符之间,如果通过tell
方法询问位置,它将给出它在文件中的位置。当书写或读取完成时,手写笔正在移动。也可以通过seek
方法移动它。感谢您的接受。我通知你,如果你认为答案是值得的,你可以接受并投票表决。