Форум сайта python.su
Вот скрипт
# -*- coding: UTF-8 -*-
import wmi
c = wmi.WMI()
f = open('filename.txt', 'wt')
for p in c.Win32_MotherboardDevice():
for pname in sorted(p.properties.keys()):
f.write('%s: %s\n' % (pname, getattr(p, pname)))
f.write('-'*20+'\n')
Traceback (most recent call last):
File "C:\tmp\wmitest.py", line 10, in <module>
f.write('%s: %s\n' % (pname, getattr(p, pname)))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 9-19: ordinal not in range(128)
# -*- coding: UTF-8 -*-
import wmi
c = wmi.WMI()
for p in c.Win32_MotherboardDevice():
for pname in sorted(p.properties.keys()):
print '%s: %s' % (pname, getattr(p, pname))
print '-'*20
Availability: None
Caption: Материнская плата
ConfigManagerErrorCode: None
ConfigManagerUserConfig: None
CreationClassName: Win32_MotherBoardDevice
Description: Материнская плата
DeviceID: Motherboard
ErrorCleared: None
ErrorDescription: None
InstallDate: None
LastErrorCode: None
Name: Материнская плата
PNPDeviceID: None
PowerManagementCapabilities: None
PowerManagementSupported: None
PrimaryBusType: PCI
RevisionNumber: None
SecondaryBusType: ISA
Status: None
StatusInfo: None
SystemCreationClassName: Win32_ComputerSystem
SystemName: WIN1
# -*- coding: UTF-8 -*-
import wmi
c = wmi.WMI()
f = open('filename.txt', 'wt')
for p in c.Win32_MotherboardDevice():
f.write('%s\n' % getattr(p, 'Caption').encode('utf-8'))
# -*- coding: UTF-8 -*-
import wmi
c = wmi.WMI()
f = open('filename.txt', 'wt')
for p in c.Win32_MotherboardDevice():
for pname in sorted(p.properties.keys()):
val = getattr(p, pname)
if type(val) == unicode:
val = val.encode('utf-8')
else:
val = str(val)
f.write('%s: %s\n' % (pname, val))
f.write('\n\n')
Traceback (most recent call last):
File "C:\tmp\wmitest3.py", line 16, in <module>
f.write('%s: %s\n' % (pname, val))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128)
Офлайн
попробуй val = val.encode('cp1251')
Офлайн
Пробовал, тоже самое.
3-й скрипт который я привел работает, не могу понять почему не работает 4-й
Офлайн
Я в таких случаях что только не делаю и decode и encode, и двойные кавычки ‘“’+val+'”'
Офлайн
И что-нибудь работает?
Офлайн
svasобязательно ))
И что-нибудь работает?
Отредактировано (Апрель 21, 2010 12:07:34)
Офлайн
>>> s1 = unicode("string1", "cp1251")
>>> s2 = "string2"
>>> type(s1), type(s2)
(<type 'unicode'>, <type 'str'>)
>>> type("%s" % s1)
<type 'unicode'>
>>> type("%s" % s2)
<type 'str'>
>>> s3 = "%s%s" % (s1, s2)
>>> type(s3)
<type 'unicode'>
>>> type(s3.encode("cp1251"))
<type 'str'>
svasбессмысленны… pname по прежнему unicode строка. В файл вы по прежнему пытаетесь записать unicode строку. При записи в файл в Windows кодировка терминала (атрибут encoding) не определена. Поэтому используется кодировка, указанная в модуле site. А там такая строка:
if type(val) == unicode:
val = val.encode('utf-8')
else:
val = str(val)
f.write('%s: %s\n' % (pname, val))
encoding = "ascii" # Default value set by _PyUnicode_Init()
>>> f = open("test.txt", "w")
>>> f.encoding
>>> import sys
>>> sys.stdout.encoding
'cp1251'
>>> '%s: %s\n' % (unicode("str", "cp1251"), "Обычная строка")
Traceback (most recent call last):
File "<pyshell#18>", line 1, in <module>
'%s: %s\n' % (unicode("str", "cp1251"), "Обычная строка")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 0: ordinal not in range(128)
Отредактировано (Апрель 21, 2010 13:35:21)
Офлайн
нужно значение “getattr(p, pname)” преобразовать в уникод
Офлайн
Ну примерно разобрался, спасибо
Офлайн