Вопрос

Я пытаюсь отформатировать файл так, чтобы его можно было вставить в базу данных, файл изначально сжат и имеет размер около 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top