синтаксический анализ.unquote_plus Ошибка типа
Вопрос
Я пытаюсь отформатировать файл так, чтобы его можно было вставить в базу данных, файл изначально сжат и имеет размер около 1,3 МБ.Каждая строка выглядит примерно так:
398,%7ЕАнонием+001%7Е,543,480,7525010,1775,0
Вот как выглядит код, который анализирует этот файл:
Village = gzip.open(Root+'\\data'+'\\' +str(Newest_Date[0])+'\\' +str(Newest_Date[1])+'\\' +str(Newest_Date[2])\
+'\\'+str(Newest_Date[3])+' village.gz');
Village_Parsed = str
for line in Village:
Village_Parsed = Village_Parsed + urllib.parse.unquote_plus(line);
print(Village.readline());
Когда я запускаю программу, я получаю эту ошибку:
Village_Parsed = Village_Parsed + urllib.parse.unquote_plus(line);
файл "C:\Python31\lib\urllib\parse.py", строка 404, в unquote_plus без кавычек строка = string.replace('+', ' ') Ошибка типа:ожидаемый объект с интерфейсом buffer
Есть какие-нибудь идеи, что здесь не так?Заранее спасибо за любую помощь :)
Решение
import gzip, os, urllib.parse
archive_relpath = os.sep.join(map(str, Newest_Date[:4])) + ' village.gz'
archive_path = os.path.join(Root, 'data', archive_relpath)
with gzip.open(archive_path) as Village:
Village_Parsed = ''.join(urllib.parse.unquote_plus(line.decode('ascii'))
for line in Village)
print(Village_Parsed)
Выходной сигнал:
398,~Anoniem 001~,543,480,7525010,1775,0
ПРИМЕЧАНИЕ: RFC 3986 - Унифицированный идентификатор ресурса (URI):Общий Синтаксис говорит:
Эта спецификация не предписывает какую-либо конкретную кодировку символов для сопоставления между символами URI и октетами, используемыми для хранения или передачи этих символов.Когда URI в элемент протокола, кодировка определяется тем, что протокол;без такого определения предполагается, что URI имеет ту же кодировку символов, что и окружающий текст.
Следовательно 'ascii'
в line.decode('ascii')
фрагмент должен быть заменен любой кодировкой символов, которую вы использовали для кодирования своего текста.
Другие советы
ПРОБЛЕМА 1 заключается в том, что urllib.unquote_plus не нравится line
что вы его накормили.Сообщение должно быть "Пожалуйста, укажите объект str" :-) Я предлагаю вам исправить проблему 2 ниже и вставить:
print('line', type(line), repr(line))
сразу после вашего for
утверждение, чтобы вы могли видеть, что вы получаете в line
.
Вы обнаружите, что он возвращает байтовые объекты:
>>> [line for line in gzip.open('test.gz')]
[b'nudge nudge\n', b'wink wink\n']
Использование режима "r" дает незначительный эффект:
>>> [line for line in gzip.open('test.gz', 'r')]
[b'nudge nudge\n', b'wink wink\n']
Я предлагаю, чтобы вместо того, чтобы передавать line
к процедуре синтаксического анализа, которую вы передаете line.decode('UTF-8')
...или какая бы кодировка ни использовалась при написании файла gz.
ПРОБЛЕМА 2 находится в этой строке:
Village_Parsed = str
str
это тип.Вам нужен пустой объект str.Чтобы получить это, вы могли бы вызвать тип, т.е. str()
что формально правильно, но непрактично / необычно / насмешливо / странно по сравнению с использованием строковой константы ''
...так что сделай это:
Village_Parsed = ''
У вас также есть ПРОБЛЕМА 3:ваше последнее утверждение пытается прочитать файл gz после EOF.