微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

循环 JSON 到附加 CSV 的多文件处理

如何解决循环 JSON 到附加 CSV 的多文件处理

我在使用 for 循环的正确语法时遇到问题,无法一次打开多个 gzip 行 json 文件,处理文件以仅提取某些键值对,然后保存到附加的单个 csv 文件。 gzip 文件很大。

for 循环应该如何嵌套打开、处理、一次写入一个文件

我似乎在写入之前一次打开/加载所有文件,然后最终导致内存崩溃或一次成功打开 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 列表运行良好。

解决方法

我看到了三个问题,但我不知道这是否会导致您描述的问题

  1. tweets 列表一直在增长,可能会导致内存错误,您应该在写完推文后重新设置它(tweets = []

  2. 最后不需要 infile.close()outfile.close(),这已经由上下文管理器 (with open ...) 处理了

  3. 您只写入文件一次,因为您只写入 if outfile.tell() == 0,也许您打算将最后一行放在 if 块之外?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。