我正在尝试格式化文件以便将其插入到数据库中,该文件最初是压缩的并且大小为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:期望具有缓冲区接口的对象
知道这里有什么问题吗? 在此先感谢您的任何帮助:)
答案 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')
应替换为您用于对文字进行编码的任何字符编码。