需要一个整数?open()

52

我有一个非常简单的Python脚本,应该扫描一个文本文件,其中包含格式为id='value'的行,并将它们放入字典中。Python模块名为chval.py,输入文件为in.txt。以下是代码:

import os,sys
from os import *
from sys import *

vals = {}

f = open(sys.argv[1], 'r')

for line in val_f:
    t = line.split('=')
    t[1].strip('\'')
    vals.append(t[0], t[1])

print vals

f.close()

当我尝试运行它时,出现以下错误:
Traceback (most recent call last): File "chval.py", line 9, in ? f = open(sys.argv[1], 'r') TypeError: an integer is required
我正在使用Python 2.4...因为我被挑战不使用更新的版本,open()有什么问题吗?为什么它需要一个整数?
那行代码之后的部分没有经过测试。简而言之:为什么会出现这个错误,如何修复?

1
你的脚本有一个错误。vals是一个字典,它没有append方法。你只想用vals[t[0]]=t[1]]进行赋值。 - Christopher
另外,应该是“for line in f:”,而不是“val_f”。 - Sev
是的,Sev,我已经浏览了一遍并且在中途更改了我的变量...感谢你指出这一点。 - Victor
所以我在我的问题中又添加了另一个问题,我遇到了“文件未找到错误”的问题。 我在工作的机器上设置了隐藏扩展名,因此该文件被称为in.txt.txt而不是仅仅是in.txt。 - Victor
原因 == “机器...被设置为隐藏扩展名”;影响 =“文件被称为in.txt.txt”??? - John Machin
1
是的,我的评论不够清楚,最初我遇到了一个错误,即 in.txt 文件不存在,但在我的脑海中,“那是不可能的!” 所以我开始往代码里添加东西。其中之一是“from os import *”。 那引起了另一个错误,我以为解决了一个问题,结果又出现了另一个问题。 在问题得到回答后,我的代码又回到了最初的错误。因此,我编辑了我的问题来解决这个问题,发现我的机器没有显示扩展名,而且 in.txt 确实不存在,所以我重新编辑了我的问题,并在我的先前的评论中留下了它,以防被读取。 - Victor
7个回答

91

由于你使用了from os import *,所以你(无意中)使用了需要整数标志而不是文本“r”或“w”的os.open。删除这行代码,你就可以解决这个错误。


非常感谢。我已经寻找解决方案很长时间了。终于能够理解,我错过了什么。再次非常感谢。 - Ozzius

15

没有充分的理由,请勿执行从任何地方导入*(并且几乎没有什么好理由)。

你的代码正在调用 os.open() 函数而不是内置的 open() 函数。如果你真的想使用 os.open(),请先执行import os,然后再调用os.open(...)。无论你想要调用哪个 open 函数,请阅读文档了解它需要什么参数。


12

需要注意的是,从Python 2.6开始,内置函数open()现在是io.open()函数的别名。甚至考虑在Python 3中删除内置的open()函数,并要求使用io.open()函数,以避免由于"from blah import *"等情况而导致的意外命名空间冲突。在Python 2.6+中,你可以编写以下代码(也可以将这种风格视为良好实践):

import io
filehandle = io.open(sys.argv[1], 'r')

5
提供这些参数解决了我的问题:
with open('tomorrow.txt', mode='w', encoding='UTF-8', errors='strict', buffering=1) as file:
    file.write(result)

0

http://www.tutorialspoint.com/python/os_open.htm,您还可以保留导入和使用

file = os.open("foo.txt", mode)

而mode可以是:

os.O_RDONLY: open for reading only
os.O_WRONLY: open for writing only
os.O_RDWR : open for reading and writing
os.O_NONBLOCK: do not block on open
os.O_APPEND: append on each write
os.O_CREAT: create file if it does not exist
os.O_TRUNC: truncate size to 0
os.O_EXCL: error if create and file exists
os.O_SHLOCK: atomically obtain a shared lock
os.O_EXLOCK: atomically obtain an exclusive lock
os.O_DIRECT: eliminate or reduce cache effects
os.O_FSYNC : synchronous writes
os.O_NOFOLLOW: do not follow symlinks

0

那是因为你应该做:

open(sys.argv[2], "w", encoding="utf-8")

或者

open(sys.argv[2], "w")

0

你有 from os import * 我也遇到了同样的错误,把那一行删除并改为 import os,在 os 库函数后面加上 os.[function]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接