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

时间:2018-07-18 18:41:59

标签: python

我正在尝试制作一个AutoHotKey脚本,该脚本从您键入的大多数单词中删除字母“ 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

最奇怪的部分是,尽管它永远无法正确显示,但输出文件中的文本可能会根据输入文件中的行数而变化。

2 个答案:

答案 0 :(得分:0)

我将其作为正式回答,而不是发表评论,因为值得指出脱衣舞娘的工作方式,并且要使诸如换行符之类的隐藏字符感到厌倦。

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

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

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

答案 1 :(得分:0)

lhay对strip()的行为的回答是正确的,但我不认为列表理解确实符合“简单”的要求。

我会改用replace():

>>> 'elemental'.replace('e', '')
'lmntal'

(另外请注意:for word in f:与代码的前三行具有相同的作用。)