2017-02-14 48 views
2

我已经写了一个脚本来从外语文本中删除多余的空格。当我在Windows命令提示符下执行脚本时,我没有收到任何错误。一切都很完美。但是,我在脚本中指定的输出文件并未创建,也没有修改输入文件。我尝试为脚本写入空白文档'corpus_1'。然后我试着回写输入文件。无论哪种方式,指定的文件保持不变。我如何让脚本写入文件?我在代码中缺少什么?为什么我的脚本不写入文件?

def lettersWhitespace(): 

    replacements = {' ':' ', 'c ':'c'} 

    with open('C:\\Users\\Charles\\corpus.odt','w+') as infile, open('C:\\Users\\Charles\\corpus_1.odt', 'w') as outfile: 
     for line in infile: 
      for src, target in replacements.iteritems(): 
       line = line.replace(src, target) 
      outfile.write(line) 

编辑:我相信我发现了这个问题。看来我的第一行'def lettersWhitespace():'是多余的。正如所写,该脚本正在定义一个函数,但不会调用该函数。这听起来正确吗?

+0

'w +'擦除文件。我希望这不是你唯一的副本。 – user2357112

+0

感谢您的意见。我有几个备份,但我甚至没有在运行脚本后出现擦除文件。没有什么被修改。 然而,当我最终得到这个工作,我应该只是'W'而不是'W +'? –

回答

1

这两个ww+截断该文件。假设你有一个包含abc(每一个换行符)的文件:

with open('testfile.txt', 'w') as f: 
    f.write('a\nb\nc') 

,你在r打开它,你可以读取文件:如果您在w+打开

with open('testfile.txt', 'r') as f: 
    print(f.read()) 
# a 
# b 
# c 

它被截断(空):

with open('testfile.txt', 'w+') as f: 
    print(f.read()) 
# 

你可能想要一个“非截断”读/写模式明星婷在文件开头:r+(或者,如果你想要的文件句柄是在文件的结尾:a+

with open('testfile.txt', 'r+') as outp, open('testfile.txt', 'r') as inp: 
    for line in inp: 
     line = line.replace('a', 'b') 
     outp.write(line) 

其修改文件为你写:

with open('testfile.txt', 'r') as f: 
    print(f.read()) 
# b 
# b 
# c 

可以在this StackOverflow answer of @And找到文件模式的非常方便的摘要。

+0

谢谢。我是一个新手,已经将'w'理解为'写','r'理解为'读','a'理解为'追加','+'理解为'读写'。它开始看起来更像图片,所以我将深入研究一些关于文件打开命令的教程。 对于有问题的脚本,是否显示这确实是我的源文本未被更改的原因?我还想知道python是否难以处理不在.txt文件中的文本? (我正在使用.odt文件作为我的输入和输出。) –

+0

@CharlesR在Windows中,二进制文件和原始数据文件之间存在差异,可能需要以'b'-模式打开文件(只需将' b''的地方到'rb +'这样的模式,不知道'.odt'文件是否是二进制文件,我也有点困惑,它有效吗?请注意,如果这个文件完全回答你的问题,请不要忘记[接受它](http://stackoverflow.com/help/accepted-answer)。 – MSeifert

+0

我还没有找到一种方法来使它工作。刚才我试着改变模式为rb +。我也切换到使用一个.txt文件用于测试目的,另外,我尝试将嵌套的'for'语句注释掉,并将输出方法更改为print()。但是,除了我的shell接受查询并给我一个新命令线。这是我最近的测试: 高清lettersWhitespace(): 开放( 'C:\\ \\用户\\查尔斯Test.txt的', 'RB +')为INFILE: 线路infile中: 打印(线) –

相关问题