如何解决循环 JSON 到附加 CSV 的多文件处理
我在使用 for 循环的正确语法时遇到问题,无法一次打开多个 gzip 行 json 文件,处理文件以仅提取某些键值对,然后保存到附加的单个 csv 文件。 gzip 文件很大。
我似乎在写入之前一次打开/加载所有文件,然后最终导致内存崩溃或一次成功打开 1 个但在写入阶段出现 I/O 错误,因为输出文件已关闭。
directory = r"*/mydirectory*"
field_names = [
"id","created_at","user_screen_name","text","lang","place_country_code","place_name","coordinates","entities_user_mentions_screen_name",]
tweets = []
for filename in os.scandir(directory):
if filename.path.endswith(".gz") and filename.is_file():
with gzip.open(filename,'r') as infile,\
open('clean_tweet_all_data.csv','a',newline="",encoding='utf-8') as outfile:
for line in infile:
tweets.append(json.loads(line)),csv_output = csv.DictWriter(outfile,delimiter=",",fieldnames=field_names,extrasaction="ignore")
if outfile.tell() == 0:
csv_output.writeheader(),csv_output.writerows(get_arrays(entry) for entry in tweets)
infile.close()
outfile.close()
函数 get_arrays(entry)
将 json 文件展平,因此用于选择键值对的 field_names
列表运行良好。
解决方法
我看到了三个问题,但我不知道这是否会导致您描述的问题
-
tweets
列表一直在增长,可能会导致内存错误,您应该在写完推文后重新设置它(tweets = []
) -
最后不需要
infile.close()
和outfile.close()
,这已经由上下文管理器 (with open ...
) 处理了 -
您只写入文件一次,因为您只写入 if
outfile.tell() == 0
,也许您打算将最后一行放在if
块之外?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。