IO操作失败

时间:2013-07-26 14:58:00

标签: python

这是代码:

def edit(aFile):
   s = ''
   filename = getMediaPath() + aFile
   inputfile = open(filename, 'r')
   read = inputfile.readlines()
   inputfile.close()
   for lines in read:
     lines = lines.lower()
     lines = lines.replace("it's", "this is")
     lines = lines.capitalize()
     s = s + str(lines)
   newfile = getMediaPath() + 'happyEdited.txt'
   x = open(newfile, 'w')
   x.write(s)
   x.close()

我得到的错误是在“inputfile =”行。它说: “I / O操作失败。 我试图读取一个文件,但不能。你确定该文件存在吗?如果确实存在,您是否指定了正确的目录/文件夹?“**

我尝试将 aFile 作为带有媒体路径的字符串输入。我已经尝试将 aFile 设置为等于它的媒体路径,但没有任何效果。当我取出参数并将代码中的 aFile 替换为.txt文件的名称时,代码可以正常工作。

谢谢你们!

3 个答案:

答案 0 :(得分:1)

一些建议:

您可以包含一个用于调试的检查例程,例如

import os
print os.path.exists(filename) 
print os.path.isfile(filename)

而且,我建议使用

with open(filename,'r') as inputfile:
    # do your stuff

而不是

inputfile = open(filename, 'r')
# do your stuff
inputfile.close()

因为如果with出现问题,# do your stuff section会确保文件流肯定会关闭,否则您必须使用excepts来确保它,这只是一点点多一点努力。 with只是一种更方便的方式。

我认为让你的案子工作所需要的是:

newfile = getMediaPath() + '/happyEdited.txt'

答案 1 :(得分:0)

我只是在这里添加kwatford的评论作为答案。你需要改变的是

filename = os.path.join(getMediaPath(),aFile)

newfile = os.path.join(getMediaPath() , 'happyEdited.txt')

答案 2 :(得分:0)

这里的主要问题是可能您使用的是表示相对文件路径的简单字符串。如果你要提供一个完整的追溯,那么我可以给你一个更好的答案。

现在,这会给你很多次问题,所以最好总是使用绝对路径。

现在,你说什么是绝对的道路?好吧,它是从驱动器到实际文件目的地的路径。例如:C:/Foo/Bar/Cheese/happy.py。相对文件路径是相对于当前目录的路径。例如,您在命令行中,而您是@ C:/Foo/Bar/Cheese/happy.py,如果同一目录中有另一个文件,请说more.py,那么您可以将其引用为./more.py,但这样你现在面临的问题会导致一些问题。

那么,解决方案是什么?就像我说的,使用绝对路径,现在你怎么做?那么你使用一个名为os的模块。

所以,像这样:

import os

file_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "name_of_file_in_current_dir")).replace(os.pardir, "/")

现在让我告诉你这意味着什么,os.path.abspath给你一个绝对的路径。 os.path.join允许您以灵活的方式加入路径,您可以加入文件夹。 os.path.dirname为您提供指定文件的绝对路径,在本例中为__file____file__是一个特殊变量。最后,内部操作系统可以使用不同的方式来分隔目录,有些使用//,有些使用\,有些使用\\。现在,这是最有效的/,因为它适用于所有系统。我们使用os.pardir因为它适用于所有系统,Windows,Linux和Unix,这使您的代码可移植! :d

另外,一个好的建议是使用with语句。像这样:

with open(file_path) as file:

这与围绕它放置一个try/catch块相同,但只是简单的一行。它还会为您打开和关闭文件流。