python - 保存具有不同名称的多个 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 我将只得到最后一组值(在越过另一圈之前)。
你有什么建议?我一直在考虑添加一些for
,if
所以让我知道你们认为最好的选择。这个项目是最近的,我一直在一步一步地确保一切正常,现在我想改进这个程序。
感谢您的帮助,如果您需要更多信息,请告诉我。我正在使用 Windows、python 3.8 和 pycharm。
解决方案
您需要在文件名中使用格式变量
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)
推荐阅读
- mysql - 在mysql中使用sum() over(Partion by)组合多行数据
- excel - Nee If 函数获取输出
- jmeter - 在 Jmeter 中参数化 JDBC 调用
- python - 用修改后的 .copy() 行替换原始 DataFrame 的行:将 .copy() 结果与原始 DataFrame 合并
- java - 录制视频时显示类似 Whatsapp 的键盘
- sap-cloud-sdk - SecurityContext.getUserInfo() 在本地主机上不起作用
- r - 如何根据不断变化的唯一值对 R 中的向量进行顺序编号?
- laravel - 如何使用父枢轴值作为条件获得雄辩的关系
- lisp - Lisp 中的“*** - EVAL:未定义的函数 X”
- python - 将 31 个数据框的嵌套列表转换为 31 个单独的数据框的最简单方法