Python IO操作失败

Python IO操作失败,python,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

代码如下:

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操作失败。 我试图读取文件,但无法读取。您确定该文件存在吗?如果确实存在,是否指定了正确的目录/文件夹?”**

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


谢谢大家

我只是在这里加上夸特福德的评论作为回答。你需要改变的是

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

newfile = os.path.join(getMediaPath() , 'happyEdited.txt')
一些建议:

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

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部分出现问题,文件流肯定会被关闭,否则您必须使用
excepts
来确保它,这只需要稍微多做一点工作<使用
编码>只是一种更方便的方式

我认为你需要做的是让你的案子运作起来:

newfile = getMediaPath() + '/happyEdited.txt'
这里的主要问题可能是您正在使用表示相对文件路径的简单字符串。如果你提供一个完整的回溯,那么我可以给你一个更好的答案

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

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

那么,解决方案是什么?就像我说的,使用绝对路径,现在你怎么做?你可以使用一个叫做

比如说:

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
为您提供指定文件的绝对路径,在本例中为
\uuuu file\uuuu
。是一个特殊变量。最后,在内部,操作系统可以使用不同的方法来分隔目录,有些使用
/
,有些使用
\
,有些使用
\
。现在,这是最有效的
/
,因为它适用于所有系统。我们使用
os.pardir
,因为它可以在所有系统、Windows、Linux和Unix上工作,这使您的代码具有可移植性!:D

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

with open(file_path) as file:

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

不要将文件名视为字符串。用于从部件构造路径。是否可以尝试在失败的行之前打印文件名?getMediaPath是否正确编码斜杠?否,相对路径本身没有问题。这只意味着路径是相对于当前目录的,而不是相对于文件系统根目录的。虽然如果您认为当前工作目录将发生更改(例如,您正在写入一个被其他服务使用的配置文件),您应该将其转换为绝对路径,但它们可以很好地日常使用。@tdelaney:实际上,我在尝试加载
config.JSON
文件时遇到过类似的问题。我使用了相对路径,但由于我在IDE中,而我的CMD不在我的工作目录中,所以我遇到了问题。使用绝对路径可以解决很多问题,并使代码更具可移植性。当然,本质上并没有什么错误,但使用绝对路径是一个很好的实践。