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