我想格式的文件,以便它可以被插入到数据库中,该文件原始压缩和角落找寻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文件

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top