2014-01-29 2 views
0

Я получил большой набор файлов sas, которые все должны изменить их файловые пути.Проблема UnicodeDecode - запись в файл SAS

Код я написал для того, что задачи выглядит следующим образом:

import glob 
import os 
import sys 

os.chdir(r"C:\path\subdir") 
glob.glob('*.sas') 
import os 
fileLIST=[] 
for dirname, dirnames, filenames in os.walk('.'): 
    for filename in filenames: 
     fileLIST.append(os.path.join(dirname, filename)) 
print fileLIST 

import re 

for fileITEM in set(fileLIST): 
    dataFN=r"//path/subdir/{0}".format(fileITEM) 
    dataFH=open(dataFN, 'r+') 

    for row in dataFH: 
    print row 
     if re.findall('\.\.\.', str(row)) != []: 
      dataSTR=re.sub('\.\.\.', "//newpath/newsubdir", row) 
     print >> dataFH, dataSTR.encode('utf-8') 
    else: 
     print >> dataFH, row.encode('utf-8') 
dataFH.close() 

Проблемы, у меня есть два раза: во-первых, кажется, что мой код не признает три последовательных периода, даже если разделенных обратным слэшем. Во-вторых, я получаю сообщение об ошибке «UnicodeDecodeError: кодек ascii не может декодировать байты ...»

Возможно ли, что файлы программы SAS (.sas) не являются utf-8? Если это так, это исправление как ? просто зная, что файл кодирования они используют

Полные отслеживающий выглядят следующим образом:.

Traceback (most recent call last): 
    File "stringsubnew.py", line 26, in <module> 
    print >> dataFH, row.encode('utf-8') 
UnicodeDecodeError: 'ascii' codec can't decode byte 0x83 in position 671: ordinal not in range(128) 

заранее спасибо

+0

Проблема заключается с ASCII-кодек пытается декодировать то с не-ASCII байт, так что файлы не в UTF-8 не ваша проблема , Пожалуйста, включите полную обратную трассировку или, по крайней мере, какую строку генерирует исключение. – geoffspear

+1

Файлы программ SAS могут быть UTF-8 или что-то еще (чаще всего wlatin1), в зависимости от кодировки сеанса, которые они были созданы/сохранены. – Joe

+0

Wooble - просто добавлен трассировка к исходному сообщению. – user43885

ответ

1

проблема заключается в чтении, а не писать Вы должны знать, что такое кодирование находится в исходном файле, который вы читаете, и декодируйте его соответствующим образом.

Допустим, исходный файл содержит данные, закодированные с помощью ISO-8859-1

Вы можете сделать это при чтении с использованием str.decode()

my_row = row.decode('iso-8859-1') 

Или вы можете открыть файл, используя кодеки позаботьтесь о нем для вас.

import codecs 

dataFH = codecs.open(dataFN, 'r+', 'iso-8859-1') 

Хороший разговор об этом можно найти на http://nedbatchelder.com/text/unipain.html

+0

Спасибо за советы После удаления 'codeode (' utf-8 ') из моего кода, я получаю следующую ошибку: 'Traceback (последний последний звонок): Файл« unicodeattempt.py », строка 25, в print >> dataFH, строка IOError: [Errno 0] Error' – user43885

+0

Вы пробовали декодировать, а также кодировать, вам нужны оба. Чтение (ввод) данных декодирования, кодирование данных на выходе (выход). – tommi00

Смежные вопросы