Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:在特定字符后修改文本文件_Python - Fatal编程技术网

Python:在特定字符后修改文本文件

Python:在特定字符后修改文本文件,python,Python,我正在用python对文本文件进行一些操作。但有一件事我还没有找到解决办法。我希望这里有人能帮助我 在文本文件的每一行中,我都有一个单词order,然后是一个由、和数字组成的字符串 现在我想删除单词order以及该行后面的所有内容,但我不知道如何删除。文件中说明顺序的位置总是不同的,因此我不能指向某个位置,然后删除所有内容。逐行遍历文件(我假设您已经这样做了),然后使用字符串。查找: >>> import string >>> x = 'helloORDERm

我正在用python对文本文件进行一些操作。但有一件事我还没有找到解决办法。我希望这里有人能帮助我

在文本文件的每一行中,我都有一个单词
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
方法移动它。感谢您的接受。我通知你,如果你认为答案是值得的,你可以接受并投票表决。