将与打印命令相同的内容保存到 .csv 文件

Save the same content to .csv file as print command

显示如下内容的打印命令(我有 3 行,但这只是示例的一部分):

O;4;Line[63];CPUA.DB1610.4122,X1;RW
V;5;Enable_maintenance_mode;;
V;5;Maintenance_start_motor;CPUA.DB1610.4124,X0;RW
O;4;Line[64];CPUA.DB1610.4124,X1;RW

我正在尝试将相同的内容保存到 csv 文件中,但在 csv 文件中我只有一行和这种格式。问题是,如何将打印显示的内容保存到 csv 文件?

O,;,4,;,L,i,n,e,[,6,4,],;,C,P,U,A,.,D,B,1,6,1,0,.,4,1,2,4,|,|,X,1,;,R,W

他们在 csv 文件中只保存了我一行

这是我的代码:

for i in range((len(result)-1)):
 print(str(result[i][0]) + ';' + str(result[i][1]) + ';' + result[i][2] + ';' + str(adress[i]))
 with open(source_file[:-4] + '_test.csv', "w") as f:
  writer = csv.writer(f)
  writer.writerow(str(result[i][0]) + ';' + str(result[i][1]) + ';' + result[i][2] + ';' + str(adress[i]))

我不知道我做错了什么。有人可以帮我解决这个问题吗?

结果包含:

['V', '5', 'Enable_maintenance_mode', "S7:[CPUA]DB1610', 'X4124.0", 'B', 'RW', '0', "0']"]
['V', '5', 'Maintenance_start_motor', "S7:[CPUA]DB1610', 'X4124.1", 'B', 'RW', '0', "0']"]
['O', '4', 'Line[64]', '', '', "']"]
['V', '5', 'Enable_maintenance_mode', "S7:[CPUA]DB1610', 'X4126.0", 'B', 'RW', '0', "0']"]

@Martin Evans 你的例子看起来很不错。但我只需要结果中的部分行并保存为 csv。 我可以这样想吗?

csv_output = csv.writer(f_output, lineterminator='\n')
 for line in result:
 #csv_output.writerow(line)
 csv_output.writerow(str(result[line][0]) + ';' + str(result[line][1]) + ';' + result[line][2] + ';' + str(adress[line])) 

但我有错误:类型错误:列表索引必须是整数,而不是列表

csv 库旨在获取列条目列表,并通过为您添加必要的分隔符将其自动转换为整个 csv 行。您的打印语句通过在每个列条目之间附加 ; 来模拟这一点。您可以指定创建 csv.writer 时要使用的分隔符,在您的示例中是 ;:

import csv

result = [
    ['V', '5', 'Enable_maintenance_mode', "S7:[CPUA]DB1610', 'X4124.0", 'B', 'RW', '0', "0']"],
    ['V', '5', 'Maintenance_start_motor', "S7:[CPUA]DB1610', 'X4124.1", 'B', 'RW', '0', "0']"],
    ['O', '4', 'Line[64]', '', '', "']"],
    ['V', '5', 'Enable_maintenance_mode', "S7:[CPUA]DB1610', 'X4126.0", 'B', 'RW', '0', "0']"]]

address = [
    "CPUA.DB1610.4122,X1;RW",
    "",
    "CPUA.DB1610.4124,X0;RW",
    "CPUA.DB1610.4124,X1;RW"]

with open('output.csv', 'w', newline='') as f_output:
    csv_output = csv.writer(f_output, delimiter=';')

    for r, a in zip(result, address):
        csv_output.writerow(r[0:3] + a.split(';'))

在 Python 3.x 中使用 csv.writer() 时,您应该始终使用 w 打开文件并设置 newline=''。此外,不使用 range() 和索引直接遍历 result 条目也更容易。由于您似乎有两个长度相等的列表,因此可以使用 zip 在迭代时为每个列表提供一个元素。

这将为您提供如下输出文件:

V;5;Enable_maintenance_mode;CPUA.DB1610.4122,X1;RW
V;5;Maintenance_start_motor;
O;4;Line[64];CPUA.DB1610.4124,X0;RW
V;5;Enable_maintenance_mode;CPUA.DB1610.4124,X1;RW

请注意,您没有为 address 提供示例,因此这是基于您的示例输出。