尝试创建一个包含从infile到outfile的数字的列表

时间:2014-03-25 03:07:55

标签: python list

def main():

    infileName = input("Insert To do list file: ")
    outfileName = input("Insert the new to do list: ")

    infile = open(infileName, "r")
    todolist = infile.readlines()

    outfile = open(outfileName, "w")

    for i in range(len(todolist)):
        print(todolist[i], file = outfile)

        infile.close()
        outfile.close()
    print("New list prints to",outfileName)

main()

我不断收到错误消息print(todolist[i], file = outfile) ValueError: I/O operation on closed file.请帮忙。

我要做的就是从列为

的文件中获取待办事项列表
  

做hw
  丢掉垃圾
  淋浴狗

我想要的是

1. do hw
2. throw away trash
3. shower dog

3 个答案:

答案 0 :(得分:1)

您有缩进错误:

for i in range(len(todolist)):
    print(todolist[i], file = outfile)

    infile.close()
    outfile.close()

像这样纠正:

for i in range(len(todolist)):
    print(todolist[i], file = outfile)

infile.close()
outfile.close()

如果你想在行开头添加数字,你应该这样做:

for i in range(len(todolist)):
        outfile.write("{0}. {1}".format(str(i), todolist[i])) 

答案 1 :(得分:0)

劳伦斯在答案中已经确定了你的代码的问题;你正在关闭循环中的文件,这意味着在你写完第一行后文件被关闭了。但是,实际上有一种比手动关闭文件更好的方法。

通常,当您打开需要处理的资源时,您应该使用with块:

with open(infileName, "r") as infile, open(outfileName, "w") as outfile:
    todolist = infile.readlines()

    for i in range(len(todolist)):
        print(todolist[i], file = outfile)

print("New list prints to",outfileName)

这样,一旦你在with块之外,文件就会被自动处理。

答案 2 :(得分:0)

您正在写入已关闭的文件。在for循环中,使用outfile.close

关闭文件

您可以使用文件上下文管理器和python的枚举功能稍微清理您的代码。以下是您的代码的改进版本:

def main():

    infileName = input("Insert To do list file: ")
    outfileName = input("Insert the new to do list: ")

    with open(infileName, 'r') as infile, \
            open(outfileName, 'w') as outfile:

        for i, line in enumerate(infile):
            print('{}. {}'.format(i, line.rstrip()) , file=outfile)

    print("New list prints to",outfileName)


main()

使用上下文管理器 - "打开(...)作为infile"让你忘记关闭文件,因为一旦上下文超出范围,python将关闭它。另请注意,您可以迭代文件对象。当你这样做时,python一次返回一行文件的内容:

for line in open('somefile.txt'):
    print line

另一个漂亮的技巧是枚举。这个功能确实:

  

返回枚举对象。序列必须是一个序列,一个迭代器,   或其他支持迭代的对象。 next()方法   enumerate()返回的迭代器返回一个包含a的元组   count(从默认为0的开始)和从中获得的值   迭代序列。

通过一个例子可以更好地理解:

>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

最后,请注意打印线条时。 Python返回' \ n'当它读取一行时,所以当你打印一行从文件中读取时,你最终会得到一个额外的,通常是意外的空白链接。