2009-06-25 14 views
28

Ich habe ein sehr einfaches Python-Skript, das sollte eine Textdatei scannen, die Linien als id formatiert enthält = ‚Wert‘ und legte sie in einen dict. Das Python-Modul heißt chval.py und die Eingabedatei ist in.txt. hier ist der Code:Eine Ganzzahl ist erforderlich? (Offen)

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() 

wenn ich versuche, es zu laufen bekomme ich:

Traceback (most recent call last):
File "chval.py", line 9, in ? f = open(sys.argv[1], 'r') TypeError: an integer is required

ich Python bin mit 2.4 ... weil ich nicht alles in Frage gestellt habe verwenden neuere, ist es etwas über open(), von dem ich nichts weiß? Warum will es eine ganze Zahl?

alles nach dieser Zeile ist nicht getestet. kurz: warum gibt es mir den Fehler und wie repariere ich es?

+1

Ihr Skript enthält einen Fehler. Vals ist ein Wörterbuch, das keine Append-Methode hat. Sie wollen nur mit Vals [t [0]] = t [1] – Christopher

+0

auch zuweisen, es soll "für Linie in f:" sein, im Gegensatz zu val_f – Sev

+0

ja Sev, ich hatte durch und änderte meine Variable auf halbem Weg ... danke, dass du darauf hingewiesen hast. – Victor

Antwort

52

Da Sie from os import * getan haben, verwenden Sie (versehentlich) os.open, die tatsächlich ein Integer-Flag anstelle eines Textes "r" oder "w" erfordert. Nimm diese Linie heraus und du wirst über diesen Fehler hinwegkommen.

9

Tun Sie nicht ohne einen guten Grund (und es gibt nicht viele).

Ihr Code übernimmt die Funktion os.open() anstelle der integrierten Funktion open(). Wenn Sie wirklich os.open() verwenden möchten, tun Sie import os und rufen Sie dann os.open(....). Welches Öffnen Sie auch immer aufrufen möchten, lesen Sie in der Dokumentation, welche Argumente benötigt werden.

9

Ebenfalls ist zu beachten, dass ab Python 2.6 die integrierte Funktion open() jetzt ein Alias ​​für die Funktion io.open() ist. Es wurde sogar in Erwägung gezogen, das integrierte open() in Python 3 zu entfernen und die Verwendung von io.open zu erfordern, um versehentliche Namespace-Kollisionen zu vermeiden, die sich aus Dingen wie "von blah import *" ergeben. In Python 2.6+ können Sie schreiben (und diesen Stil auch prüfen, können eine gute Praxis sein):

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

Von http://www.tutorialspoint.com/python/os_open.htm könnten Sie auch Ihren Import halten und

file = os.open („foo verwenden. txt“, mode)

und der Modus sein könnte:

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 
1

Durch diese Parameter Bereitstellung gelöst mein Problem:

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