【问题标题】:Why python built in function like open() behaves like explained below为什么像 open() 这样的 python 内置函数的行为如下所述
【发布时间】:2015-10-29 13:30:23
【问题描述】:

运行此代码时

def read_text():
    quotes = open("C:\Users\rajawatk\Desktop\movie_quotes.txt")  
    contents_of_file = quotes.read()   
    print(contents_of_file)    
    quotes.close()    
read_text()

以下是错误消息

显示IOError

如果通过指定读取权限运行以下代码

如果我们添加一个代表读取权限的 r,比如

quotes = open(r"C:\Users\rajawatk\Desktop\movie_quotes.txt")

瞧,我能够读取movie_quotes.txt文件的代码工作,这是输出

-- 休斯顿,我们有问题。 (阿波罗 13 号)

-- 妈妈常说,人生就像一盒巧克力。你永远不知道你会得到什么。 (阿甘正传)

-- 你无法处理真相。 (几个好男人)

-- 我相信一切,我什么也不相信。 (黑暗中的一枪)

【问题讨论】:

  • “显示 IOError”。你是说屏幕上出现了“IOError”这个词,还是屏幕上出现了“IOError is display”这个词?对我来说,它们听起来都不像普通的 Python 堆栈跟踪。
  • 错误:回溯(最近一次调用最后):文件“C:\Python27\movie_quotes.py”,第 6 行,在 read_text() 文件“C:\Python27\movie_quotes.py ", line 2, in read_text quotes = open("C:\Users\rajawatk\Desktop\movie_quotes.txt") IOError: [Errno 22] invalid mode ('r') or filename: 'C:\\Users\rajawatk \\桌面\\movie_quotes.txt'

标签: python


【解决方案1】:

如果我们添加一个代表读取权限的 r,比如

这不是r 所代表的意思。字符串前面的 r 将其标记为原始字符串,这意味着斜杠不会被解释为转义字符。

"C:\Users\rajawatk" 被解释为“C:\Users”,后跟回车,后跟“ajawatk”。
r"C:\Users\rajawatk" 被解释为“C:\Users”,后跟斜杠和字母 r,其次是“ajawatk”。

您可能没有名称中带有回车的文件,因此以前的版本不适合作为open 的参数。

【讨论】:

  • 为防止进一步混淆,您可能会选择open("C:\\Users\\rajawatk\\Desktop\\movie_quotes.txt")。通过比较print("spam\nham\neggs")print(r"spam\nham\neggs") 的结果,差异可能会更加明显
  • 或者只使用正斜杠
  • 在这里使用原始字符串很好 - 像这样的情况正是它们在语言中的原因。您只是...需要知道它们的存在以及它们是如何工作的,然后才能使用它们。
【解决方案2】:

您需要指定打开文件的模式,“\”是需要转义的转义序列。在你的情况下。

    quotes = open("C:\\Users\\rajawatk\\Desktop\\movie_quotes.txt", "r") 

然而,像你这样指定一个完整的路径名是不好的做法。您应该使用 os.path 为您提供工作目录。如果你使用'/'来指定目录,那么你不需要转义,它适用于windows和linux。

    my_dir = os.path.dirname(__file__) 
    file_path = os.path.join(my_dir, '../static/', 'movie_quotes.txt')

它会在姊妹静态目录中查找运行应用程序的目录中的文件。如果你希望它在同一个目录中。

    my_dir = os.path.dirname(__file__) 
    file_path = os.path.join(my_dir, 'movie_quotes.txt')

【讨论】:

  • 不,“r”是默认模式。你不需要指定它。
  • 原始字符串需要“r”。
猜你喜欢
  • 2019-06-01
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 2019-02-07
  • 1970-01-01
  • 2020-03-24
  • 2022-01-26
  • 1970-01-01
相关资源
最近更新 更多