2012-11-13 104 views
4

我的工作,说做一个程序,获取用户输入一个文件,然后内的文件中删除一个字符串,用户指定的一个问题。我不知道如何从我拥有的(如下)到问题所要求的。一如既往,任何和所有的帮助非常感谢。io.UnsupportedOperation:无法读取

def main(): 
    outfile = open(input("Enter a file name: "), "a") 
    string = input("Enter the string to be removed: ") 
    for string in outfile.readlines(): 
     string = string.replace(string, "") 
    outfile.close() 
    print("Done") 

main() 

我把其中一条建议,并试图得到它的工作,但正如我在下面的代码我的评论说,下面不返回错误它会创建一个空文件。我错过了什么让新文件成为删除字符串的旧文件?进入细节之前

def main(): 
    inpath = input("Enter an input file: ") 
    line = input("Enter what you want to remove: ") 
    outpath = input("Enter an output file: ") 
    with open(inpath, "r") as infile, open(outpath, "w") as outfile: 
     for line in infile: 
      outfile.write(line.replace(line, "") + "\n") 
    print("Done.") 

main() 
+5

你必须在读取模式下打开文件。尝试'“a +”' – JBernardo

+0

作为一个方面说明,您有太多名为'string'的变量。你可能想'string1 = input(...)'然后'string = string.replace(string1,“”)''。最后,您实际上需要将字符串写回到文件中。替换文件中的字符串有点困难。通常,您使用修改的内容创建一个新文件,然后在一天结束时,将新文件移到旧文件的顶部。 – mgilson

+0

@JBernardo:这是真的,但在这种情况下它并没有真正的帮助。你不能只是在阅读文件的过程中写文件 - 或者,你可以,但是它会在不同的平台上做不愉快的事情和不同的不愉快的事情。尽管如此,它仍是一个起点 - 它直接解释了OP的标题提到的错误。 – abarnert

回答

8

几个侧面说明:当你打电话string.replace(string, ""),你告诉字符串以替换其整个自我空字符串,你可能也只是做string = ""。假定第一个string是要替换的搜索字符串,所以给它一个不同的名称,然后将其用作例如string.replace(searchString, "")。另外,您不想命名变量string,因为它是标准库模块的名称。你正在调用你的输入文件“outfile”,这很容易混淆。您可能想要使用with语句而不是显式关闭。最后,你可以迭代文件中的行,只需for line in f:;你不需要for line in f.readlines()(并且,如果你需要处理的Python 2.x中,你会更乐意回避readlines(),因为它会读取整个文件到内存中,然后使一个巨大的内存中的行列表)。

第一个问题,因为JBernardo指出,是你已经打开的“一”模式中的文件,这意味着“只写的,追加到结束。”如果你想读和写,你可以使用“a +”或“r +”。

但是,这不会真的帮助你。毕竟,在读取文件的过程中,您无法写入文件。

有几种常见的解决方法。

首先,只写到标准输出,并让用户做任何他想要的结果,如,它重定向到一个文件。 (在这种情况下,你必须打印提示,“完成”的消息,等等标准错误,而不是,所以他们不重定向到文件中。)这是许多Unix工具,如sedsort做的,所以它是适当的如果你正在构建一个Unix风格的工具,但可能不适合其他用途。

def stderrinput(prompt): 
    sys.stderr.write(prompt) 
    sys.stderr.flush() 
    return input() 

def main(): 
    with open(stderrinput("Enter a file name: "), "r") as infile: 
     searchString = stderrinput("Enter the string to be removed: ") 
     for line in infile: 
      print(infile.replace(searchString, "")) 
    sys.stderr.write("Done\n") 

其次,写入另一个文件。在打开的“R”模式下的输入文件,并在“W”模式输出文件,然后你只是拷贝线:

def main(): 
    inpath = input("Enter an input file: ") 
    outpath = input("Enter an output file: ") 
    with open(inpath, "r") as infile, open("outpath", "w") as outfile: 
     for line in infile: 
      outfile.write(line.replace(searchString, "") + "\n") 

三,阅读和处理内存中的整个文件,然后截断和重写整个文件:

def main(): 
    path = input("Enter an input/output file: ") 
    with open(path, "r+") as inoutfile: 
     lines = [line.replace(searchString, "") for line in inoutfile] 
     inoutfile.seek(0) 
     inoutfile.truncate() 
     inoutfile.writelines(lines) 

最后,写入到一个临时文件(与第二个选项),然后继续前进原始输入文件的顶部该临时文件。事情是这样的:

def main(): 
    path = input("Enter an input/output file: ") 
    with open(path, "r") as infile, tempfile.NamedTemporaryFile("w", delete=False) as outfile: 
     for line in infile: 
      outfile.write(line.replace(searchString, "")) 
     shutil.move(outfile.name, pathname) 

这最后一个是有点棘手,因为POSIX和Windows之间的区别。但是,它有很大的优势。 (例如,如果你的程序在操作过程中被杀死了,不管它发生了什么,你可以保证有原始文件或新文件,而不是一些半成文的混乱。)

+0

你应该评论说'string = string.replace(string,“”)'在这个循环中是无稽之谈。在第二行,你是替换字符串是第一行。 – mgilson

+0

更糟。在第二行,您的替换字符串是第二行。在每一行中,替换字符串都是当前行。 – abarnert

+0

正确的你! – mgilson