【问题标题】:How do I create and write headers to a csv file if it doesn't exist, but if it already exists then write data?如果 csv 文件不存在,如何创建和写入标题,但如果它已经存在则写入数据?
【发布时间】:2021-07-05 16:56:13
【问题描述】:

我在 stackoverflow 上的第一篇文章,并试图通过编写一个从我玩的在线游戏的 API 调用数据的程序来涉足 python :)

我编写了下面的代码来创建一个 .csv 文件(如果它不存在),然后使用 for 循环调用 API 两次(每次都有不同的匹配 ID)。响应是 JSON 格式的,思路是如果文件为空(即新建),则执行 if 语句写入 headers,如果不为空(即 headers 已写入),则写入值。

我的代码返回一个 .csv,其中标头写入了两次 - 因此,由于某些原因,在 for 循环中,即使标头已被写入,文件大小也不会改变。我在这里缺少什么吗?非常感谢!

import urllib.request, urllib.parse, urllib.error
import json
import csv
import ssl
import os

ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

api_key = 'XXX'
puuid = 'XXX'

matchlist = ['0e8194de-f011-4018-aca2-36b1a749badd','ae207558-599e-480e-ae97-7b59f97ec8d7']

f = csv.writer(open('my_file.csv','w+'))

for matchid in matchlist: 
    matchdeturl = 'https://europe.api.riotgames.com/lor/match/v1/matches/'+ matchid +'?api_key=' + api_key
    matchdetuh = urllib.request.urlopen(matchdeturl, context = ctx)
    matchdet = json.loads(matchdetuh.read().decode())
    matchplayers = matchdet['info']

    #if file is blank, write headers, if not write values
    if os.stat('my_file.csv').st_size == 0:
        f.writerow(list(matchplayers))
        f.writerow(matchplayers.values())
    else:
        f.writerow(matchplayers.values())

【问题讨论】:

    标签: python python-3.x csv


    【解决方案1】:

    文件可能会缓冲而不是立即写入磁盘,因为 IO 是一项昂贵的操作。在检查文件大小之前flush 文件,或者在循环中设置一个标志并检查该标志而不是检查文件大小。

    f = csv.writer(open('my_file.csv','w+'))
    
    needs_header = os.stat('my_file.csv').st_size == 0
    
    for matchid in matchlist: 
        # do stuff
    
        #if file needs a header, write headers
        if needs_header:
            f.writerow(list(matchplayers))
            needs_header = False
    
        # Then, write values
        f.writerow(matchplayers.values())
    

    【讨论】:

    • 谢谢你,Pranav,成功了!出于兴趣,您将如何刷新文件?我在 for 循环之外的 print(os.stat('my_file.csv').st_size) 语句在正确写入所有内容后仍然打印 0 - 我假设这意味着文件被缓冲并且仅在整个程序被写入时执行完成了吗?
    • 啊!嗯,这就是为什么建议使用with 来处理文件的原因。当代码执行退出with 块时,文件会自动刷新并关闭。在您的情况下,我建议您不要实例化 csv 编写器并在同一语句中打开文件,而是执行以下操作:fh = open('my_file.csv', 'w+'); f = csv.writer(fh)。然后你可以在你认为有必要的时候做fh.flush()fh.close()
    • 超级有用,按照你的建议做了,效果很好。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 2018-10-09
    • 2021-01-31
    • 2022-01-10
    • 1970-01-01
    相关资源
    最近更新 更多