首页 > 解决方案 > 保存具有不同名称的多个 csv 文件,这些文件的名称取决于变量值 - python

问题描述

第一次在这里问一些东西,虽然我一直在使用这个,它真的很有帮助。我已经搜索过了,但找不到答案。

我的程序将持续接收汽车数据,我想将其保存到多个 csv 文件中。我想为每一圈存钱。所以对于 Lap1,我会有 car_data_1.csv 之类的东西,对于第二圈 car_data_2.csv 等等。

我知道如何强制执行,使用名称创建每个文件并将结果附加到该特定文件。但是由于我不知道我将有多少圈,在我看来这不是正确的方法和最好的方法。

所以在下面的代码中,当我创建行时,with open ('car_data_(LapNumber).csv', 'w') as csv_file:我希望程序创建一个名为 car_data_1 的文件,因为我将从第 1 圈开始。所以 LapNumber(该行中的括号内只是为了向您展示)是我的名称会改变的变量,我想将每个 csv 保存为每圈的数据。

import socket
import csv

'''UDP SET UP'''

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
UDP_IP = 'IP'
UDP_PORT = Port

sock.bind((UDP_IP, UDP_PORT))

'''CSV SET UP'''

fieldnames = ["On","Time","LapNumber","Engine","Speed","Power","BestLap","Distance"]

LapNumber=1

with open(f'car_data_{LapNumber}.csv','w') as csv_file:
    csv_writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
    csv_writer.writeheader()

while True:

    data, addr = sock.recvfrom(1024)  # buffer size is 1024 bytes
    values = struct.unpack("<iIffffff",data)

    LapNumber = values[2]

    with open(f'car_data_{LapNumber}.csv','a') as csv_file:
        csv_writer =csv.DictWriter(csv_file, fieldnames=fieldnames)
        #csv_writer.writeheader()

        info = {
            "On"    :values[0],
            "Time"  :values[1],
            "LapNumber" :values[2],
            "Engine"    :values[3],
            "Speed" :values[4],
            "Power" :values[5],
            "BestLap"   :values[6],
            "Distance"  :values[7],         
        }

        csv_writer.writerow(info)

我知道也许我将不得不改变结构,因为我认为我必须在条件while或类似的东西中创建 csv,因为如果我创建 csv 并在其中while附加值,它将不断覆盖上的值csv 我将只得到最后一组值(在越过另一圈之前)。

你有什么建议?我一直在考虑添加一些forif所以让我知道你们认为最好的选择。这个项目是最近的,我一直在一步一步地确保一切正常,现在我想改进这个程序。

感谢您的帮助,如果您需要更多信息,请告诉我。我正在使用 Windows、python 3.8 和 pycharm。

标签: pythonpython-3.xcsvpycharmexport-to-csv

解决方案


您需要在文件名中使用格式变量

with open('car_data_{}.csv'.format(LapNumber),'w')

现在变量LapNumber被替换到字符串中,代替{}

或者,如果您使用的是 Python 3.6 或更高版本,请使用f-strings

with open(f'car_data_{LapNumber}.csv','w')

您当前的方法会创建文件名“car_data_(LapNumber.csv)”,并且实际上并未将变量替换为字符串。

对于您问题的第二部分,与编写标题有关 - 您希望保留对您正在写入的当前圈的引用(它本身就是file您正在写入的代理)。当圈数发生变化时,您知道您正在写入一个新文件,并且需要添加一个标题。

就像是;

# Initialise writing_lap to lap number 1
writing_lap = 1
while True:

    data, addr = sock.recvfrom(1024)  # buffer size is 1024 bytes
    values = struct.unpack("<iIffffff",data)

    # Read the current lap
    current_lap = values[2]

    with open(f'car_data_{writing_lap}.csv','a') as csv_file:
        csv_writer =csv.DictWriter(csv_file, fieldnames=fieldnames)
        if current_lap > writing_lap:
             # If the current_lap has increased, write the headers
             csv_writer.writeheader()
             # And remember to update the writing_lap variable
             writing_lap = current_lap

        info = {
            "On"    :values[0],
            "Time"  :values[1],
            "LapNumber" :values[2],
            "Engine"    :values[3],
            "Speed" :values[4],
            "Power" :values[5],
            "BestLap"   :values[6],
            "Distance"  :values[7],         
        }

        csv_writer.writerow(info)


推荐阅读