Python 将字符串写入文件时的奇怪行为

Python 将字符串写入文件时的奇怪行为,python,Python,我正在尝试制作一个自动热键脚本,从您键入的大多数单词中删除字母“e”。为此,我将在一个文本文件中列出一组常用单词,并让python脚本为每个单词向AHK文件添加正确的语法。出于测试目的,我的单词列表文件“words.txt”包含以下内容: apple dog tree 我希望在运行python脚本后,文件“wordsOut.txt”(我将转换为AHK脚本)中的输出结果如下: ::apple::appl ::tree::tr 如您所见,它将排除不带字母“e”的单词,并从其他所有单词中删除“e”

我正在尝试制作一个自动热键脚本,从您键入的大多数单词中删除字母“e”。为此,我将在一个文本文件中列出一组常用单词,并让python脚本为每个单词向AHK文件添加正确的语法。出于测试目的,我的单词列表文件“words.txt”包含以下内容:

apple
dog
tree
我希望在运行python脚本后,文件“wordsOut.txt”(我将转换为AHK脚本)中的输出结果如下:

::apple::appl
::tree::tr
如您所见,它将排除不带字母“e”的单词,并从其他所有单词中删除“e”。但是当我运行我的脚本时,看起来像这样

f = open('C:\\Users\\jpyth\\Desktop\\words.txt', 'r')

while True:
    word = f.readline()

    if not word: break

    if 'e' in word:
        sp_word = word.strip('e')
        outString = '::{}::{}'.format(word, sp_word)

        p = open('C:\\Users\\jpyth\\Desktop\\wordsOut.txt', 'a+')
        p.write(outString)
        p.close()

f.close()
输出文本文件的结尾如下所示:

::apple
::apple
::tree::tr

最奇怪的是,虽然它永远不会正确,但输出文件中的文本可能会根据输入文件中的行数而变化。

我将此作为一个正式答案,而不是评论,因为值得指出strip的工作原理,并且厌倦像新行字符这样的隐藏字符

f.readline()
返回每一行,包括“\n”。因为strip()只从字符串的开头和结尾删除字符,而不是从中间删除字符,所以它实际上并没有从大多数带有“e”的单词中删除任何内容。事实上,即使是以“e”结尾的单词也不会删除“e”,因为它的右边有一个新行字符。这也解释了为什么::apple打印在两行上

'hello\n'。条带('o')
输出
'hello\n'
'hello'.strip('o')
输出
'hell'


正如评论中指出的那样,只要做
sp_word=word.strip().replace('\n','').replace('e','')

lhay关于strip()行为的回答是正确的,但我不相信列表理解真的是“简单”的

我会选择replace():


(另请注意:
对于f中的word:
的作用与代码的前三行相同。)

strip从字符串的开头和结尾删除字符,而不是从中间删除。如果在每次运行脚本之间手动删除
wordsOut.txt
,由于您没有在代码中清除它?@glibdud我一直在删除测试之间的文件这可能的重复与
.strip()
无关,与
.readline()有关
在字符串上留下
EOL
,这是我认为为数不多的事情之一。这种理解很难看
sp_word=word.strip().replace('e','')
@feelingwelcome如果您习惯于以任何有意义的形式处理文件数据,那么最小惊讶原则将指示您不要隐式地剥离字符。添加额外的显式strip()可以让读者清楚地看到流。你对文件的误解不是每个人都能理解的。
>>> 'elemental'.replace('e', '')
'lmntal'