【问题标题】:An integer is required? open()需要整数吗?打开()
【发布时间】:2009-06-25 23:11:49
【问题描述】:

我有一个非常简单的 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()

当我尝试运行它时,我得到:

回溯(最近一次通话最后一次):
文件“chval.py”,第 9 行,在? f = open(sys.argv[1], 'r') TypeError: an integer is required

我正在使用 python 2.4... 因为我一直面临着不使用任何更新的挑战,关于 open() 有什么我不知道的吗?为什么它需要一个整数?

该行之后的任何内容都未经测试。简而言之:为什么它会给我错误,我该如何解决?

【问题讨论】:

  • 您的脚本中存在错误。 vals 是一个字典,它没有 append 方法。您只想分配 vals[t[0]]=t[1]
  • 另外,它应该是“for line in f:”,而不是 val_f
  • 是的,sev,我已经完成并在中途更改了我的变量...感谢您指出这一点。
  • 所以我在我的问题中添加了另一个问题,即我收到“找不到文件错误”我正在工作的机器设置为隐藏扩展名,因此该文件被称为 in.txt。 txt 而不仅仅是 in.txt
  • 是的,我的评论不清楚,我最初收到一个错误,即 in.txt 文件不存在,但在我看来“那是不可能的!”所以我开始把东西扔进我的代码中。其中一个是“from os import *”,它带来了一个不同的错误,我认为我已经解决了一个问题以找到另一个问题。在回答了这个问题后,我的代码恢复了原来的错误。所以我编辑了我的问题来解决这个问题,在发现我的机器没有显示扩展并且 in.txt 确实不存在后,我重新编辑了我的问题并留下了我之前的评论,以防它被阅读。

标签: python file-io integer argv


【解决方案1】:

因为您使用了from os import *,所以您(意外地)使用了 os.open,它确实需要一个整数标志而不是文本的“r”或“w”。去掉那条线,你就会克服这个错误。

【讨论】:

  • 非常感谢。我一直在寻找解决方案。终于明白了,我在哪里忽略了这么久。再次感谢您。
【解决方案2】:

不要在没有充分理由的情况下使用import * from wherever(而且数量不多)。

您的代码使用的是 os.open() 函数,而不是内置的 open() 函数。如果您真的想使用 os.open(),请执行 import os 然后调用 os.open(....)。无论您要调用哪个打开,请阅读有关它需要哪些参数的文档。

【讨论】:

    【解决方案3】:

    另外值得注意的是,从 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')
    

    【讨论】:

      【解决方案4】:

      提供这些参数解决了我的问题:

      with open('tomorrow.txt', mode='w', encoding='UTF-8', errors='strict', buffering=1) as file:
          file.write(result)
      

      【讨论】:

        【解决方案5】:

        来自http://www.tutorialspoint.com/python/os_open.htm你也可以保留你的导入和使用

        file = os.open("foo.txt", 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
        

        【讨论】:

          【解决方案6】:

          那是因为你应该这样做:

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

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

          【讨论】:

            【解决方案7】:

            你有from os import * 我也遇到了同样的错误,删除该行并将其更改为import os 并在 os lib 函数后面添加 os.[function]

            【讨论】:

              猜你喜欢
              • 2015-05-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-03-15
              • 2018-09-16
              • 2022-10-02
              • 2012-08-14
              • 1970-01-01
              相关资源
              最近更新 更多