代码之家  ›  专栏  ›  技术社区  ›  Victor

需要整数?打开()

  •  35
  • Victor  · 技术社区  · 15 年前

    我有一个非常简单的python脚本 应该 扫描文本文件,其中包含格式化为 身份证件 = 价值 '并将它们放入dict中。python模块称为chval.py,输入文件位于.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行,in? F=open(sys.argv[1],'r')类型错误:需要整数

    我用的是python 2.4…因为我一直被挑战不使用任何更新的东西,有什么关于open()的东西我不知道吗?为什么它需要一个整数?

    那条线之后的任何东西都是未经测试的。简而言之:为什么它会给我错误,我该如何修复它?

    5 回复  |  直到 6 年前
        1
  •  59
  •   Mark Rushakoff    15 年前

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

        2
  •  11
  •   John Machin Santi    15 年前

    不要做 import * from wherever 没有很好的理由(也没有很多理由)。

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

        3
  •  10
  •   Wheat    15 年前

    另外需要注意的是,从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
  •  1
  •   gary    6 年前

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

    with open('tomorrow.txt', mode='w', encoding='UTF-8', errors='strict', buffering=1) as file:
        file.write(result)
    
        5
  •  0
  •   Omar Jaafor    9 年前

    http://www.tutorialspoint.com/python/os_open.htm 你也可以保留你的进口和使用

    文件=os.open(“foo.txt”,模式)

    模式可以是:

    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