parse.unquote_plus类型错误
题
我想格式的文件,以便它可以被插入到数据库中,该文件原始压缩和角落找寻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.replace( '+','“) 类型错误:预期与缓冲接口的对象
任何想法,这里有什么问题? 预先感谢任何帮助:)
解决方案
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']
我建议GZ写入文件时,而不是传递line
的分析例程传递line.decode('UTF-8')
......或任何编码被使用。
问题2是在这条线:
Village_Parsed = str
str
是一种类型。你需要一个空的海峡对象。为了得到这一点,你可以调用类型,即str()
这在形式上是正确的,但不切实际/异常/ scoffable /怪异相比,使用字符串常量''
时...所以做到这一点:
Village_Parsed = ''
您也有问题3:你最后的语句试图读取EOF后GZ文件
。