Разбор внутри директории проблемы Python 2.7 против 3.2 - PullRequest
1 голос
/ 20 мая 2011

Я пытаюсь выполнить базовый анализ файлов в каталоге в Python 3. Этот код отлично работает в Python 2.7, но я не могу понять, в чем проблема в Python 3.2.

import sys, os, re

filelist = os.listdir('/Users/sbrown/Desktop/Test') 
os.chdir('/Users/sbrown/Desktop/Test') 
for file in filelist:
    infile = open(file, mode='r') 
    filestring = infile.read() 
    infile.close() 
    pattern = re.compile('exit') 
    filestring = pattern.sub('so long', filestring) 
    outfile = open(file, mode='w') 
    outfile.write(filestring)
    outfile.close 
exit

Это ошибка, которая возвращается:

Traceback (most recent call last):
  File "/Users/bunsen/Desktop/parser.py", line 9, in <module>
      filestring = infile.read()
  File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/encodings/ascii.py", line 26, in decode
      return codecs.ascii_decode(input, self.errors)[0]
  UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 3131: ordinal not in range(128)`

Все файлы, которые я анализирую, являются текстовыми файлами. Я попытался указать кодировку в аргументах метода для utf-8, но это не сработало. Есть идеи? Заранее спасибо!

Если я укажу кодировку как utf-8, выдается следующее сообщение об ошибке:

Traceback (most recent call last):
  File "/Users/sbrown/Desktop/parser.py", line 9, in <module>
    filestring = infile.read()
  File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 3131: ordinal not in range(128)`

Ответы [ 3 ]

4 голосов
/ 20 мая 2011

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

Теперь вы пытались использовать UTF-8, и это не сработало, так что очевидно, что это не так.т кодировка используется.Только вы знаете, что это за кодировка, но я предполагаю это cp1252, так как 0x80 - это символ этой кодовой страницы для €, поэтому сбой на 0x80 является обычным явлением, когда у вас есть европейские пользователи Windows.: -)

Для совместимости с Python 2.7 и 3.1 я рекомендую использовать библиотеку io для открытия файлов.Это тот, который используется в Python 3 по умолчанию, и он также доступен в Python 2.6 и более поздних версиях:

import io
infile = io.open(filelist[0], mode='rt', encoding='cp1252')
0 голосов
/ 20 мая 2011

Это работает?

import codecs
infile = codecs.open(filelist[0], encoding='UTF-8')
infile.read()
0 голосов
/ 20 мая 2011

Тест

filelist = os.listdir('/Users/sbrown/Desktop/Test') 
infile = open(filelist[0], mode='r') 
print(infile.encoding)

, чтобы убедиться, что вы читаете свои файлы в utf-8.Если нет, проверьте, не сделали ли вы что-нибудь злое с codecs.Также не могли бы вы опубликовать трассировку для вашего теста с принудительным utf-8?

...