parse.unquote_plus TypeError

时间:2009-11-04 09:26:29

标签: python parsing urllib typeerror

我正在尝试格式化文件以便将其插入到数据库中,该文件最初是压缩的并且大小为1.3MB。 每一行看起来像这样:

  

398,%7EAnoniem + 001%7E,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 = string.replace('+','')   TypeError:期望具有缓冲区接口的对象

知道这里有什么问题吗? 在此先感谢您的任何帮助:)

2 个答案:

答案 0 :(得分:2)

问题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:你的最后一句话是在EOF之后尝试读取gz文件。

答案 1 :(得分:0)

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 - Uniform Resource Identifier (URI): Generic Syntax说:

  

本规范不强制要求   任何特定的字符编码   用于URI字符和。之间的映射   用于存储或存储的八位字节   传输这些字符。当一个URI   出现在协议元素中,   字符编码由它定义   协议;没有这样的   定义,假定URI在   与...相同的字符编码   周围的文字。

因此,'ascii'片段中的line.decode('ascii')应替换为您用于对文字进行编码的任何字符编码。