2013-06-02 8 views
0

Я получаю ошибку атрибута: объект 'int' не имеет атрибута 'write'.Python os.write (filehandler, data): TypeError Требуется целое число

Вот часть моего сценария

data = urllib.urlopen(swfurl) 

     save = raw_input("Type filename for saving. 'D' for same filename") 

     if save.lower() == "d": 
     # here gives me Attribute Error 

      fh = os.open(swfname,os.O_WRONLY|os.O_CREAT|os.O_TRUNC) 
      fh.write(data) 

     # ##################################################### 

Вот ошибка:

Traceback (most recent call last): 
    File "download.py", line 41, in <module> 
    fh.write(data) 
AttributeError: 'int' object has no attribute 'write' 

ответ

3

os.open возвращает дескриптор файла. Используйте os.write для записи в открытый файл

import os 
# Open a file 
fd = os.open("foo.txt", os.O_WRONLY | os.O_CREAT | os.O_TRUNC) 
# Write one string 
os.write(fd, "This is test") 
# Close opened file 
os.close(fd) 

Или лучше использовать питон файлов, если не требуется какой-либо низкий уровень API

with open('foo.txt', 'w') as output_file: 
    output_file.write('this is test') 
1

os.open() возвращает дескриптор файла (целое число), а не объектный файла , Из docs:

Note: This function is intended for low-level I/O. For normal usage, use the built-in function open() , which returns a “file object” with read() and write() methods (and many more). To wrap a file descriptor in a “file object”, use fdopen() .

Вы должны использовать встроенную open() функцию вместо:

fh = open(swfname, 'w') 
fh.write(data) 
fh.close() 

Или контекстный менеджер:

with open(swfname, 'w') as handle: 
    handle.write(data) 
+0

В этой ситуации, встроенные открытые() не подходит потому что ему не хватает API низкого уровня, необходимого для передачи флагов O_WRONLY, O_CREAT и O_TRUNC. Плакат правильно использовать os.open(). Если вы не знакомы с этим механизмом, см. Ответ @ oleg, в котором описываются встроенные функции open() и os.open() и дается некоторое указание, когда следует использовать os.open(). –