gpt4 book ai didi

Python - Readline 跳过字符

转载 作者:太空宇宙 更新时间:2023-11-04 03:30:21 25 4
gpt4 key购买 nike

我在解析大文本文件中的 json 对象时遇到了一个奇怪的问题,我找到的解决方案并没有多大意义。我正在使用以下脚本。它复制 bz2 文件,解压缩它们,然后将每一行解析为一个 json 对象。

import os, sys, json

# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# USER INPUT
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

args = sys.argv
extractDir = outputDir = ""

if (len(args) >= 2):
extractDir = args[1]
else:
extractDir = raw_input('Directory to extract from: ')

if (len(args) >= 3):
outputDir = args[2]
else:
outputDir = raw_input('Directory to output to: ')

# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# RETRIEVE FILE
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

tweetModel = [u'id', u'text', u'lang', u'created_at', u'retweeted', u'retweet_count', u'in_reply_to_user_id', u'coordinates', u'place', u'hashtags', u'in_reply_to_status_id']

filenames = next(os.walk(extractDir))[2]
for file in filenames:
if file[-4:] != ".bz2":
continue

os.system("cp " + extractDir + '/' + file + ' ' + outputDir)
os.system("bunzip2 " + outputDir + '/' + file)

# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# PARSE DATA
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

input = open (outputDir + '/' + file[:-4], 'r')
output = open (outputDir + '/p_' + file[:-4], 'w+')

for line in input.readlines():
try:
tweet = json.loads(line)
for field in enumerate(tweetModel):
if tweet.has_key(field[1]) and tweet[field[1]] != None:
if field[0] != 0:
output.write('\t')
fieldData = tweet[field[1]]
if not isinstance(fieldData, unicode):
fieldData = unicode(str(fieldData), "utf-8")

output.write(fieldData.encode('utf8'))
else:
output.write('\t')

except ValueError as e:
print ("Parse Error: " + str(e))
print line
line = input.readline()
quit()
continue

print "Success! " + str(len(line))
input.flush()

output.write('\n')

# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# REMOVE OLD FILE
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

os.system("rm " + outputDir + '/' + file[:-4])

for line in input.readlines(): 循环中读取某些行时,这些行偶尔会在不一致的位置被截断。由于换行符也被截断了,它会继续读取,直到在下一个 json 对象的末尾找到换行符。结果是一个不完整的 json 对象,后面是一个完整的 json 对象,所有这些都被解析器视为一行。我找不到这个问题的原因,但我确实发现将循环更改为

filedata = input.read()
for line in filedata.splitlines():

成功了。有谁知道这里发生了什么?

最佳答案

在查看了 file.readlines 和 string.splitlines 的源代码后,我想我明白了。 注意:这是 python 2.7 源代码,所以如果您使用的是其他版本……也许这个答案适用,也许不适用。

readlines使用函数 Py_UniversalNewlineFread测试换行 splitlines使用常量 STRINGLIB_ISLINEBREAK只是测试\n 或\r。我怀疑 Py_UniversalNewlineFread 在文件流中选择了一些字符作为换行符,而它并不是真正打算作为换行符,可能来自编码......我不知道......但是当你将所有相同的数据转储到splitlines 将它与\r 和\n 进行检查,因为没有匹配项,所以 splitlines 继续移动,直到遇到真正的换行符,你得到了你想要的行。

关于Python - Readline 跳过字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31309890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com