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

时间:2016-04-25 07:29:47

标签: python csv save

打印命令显示我这样的东西(我有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])) 

但是我有错误:TypeError:list indices必须是整数,而不是list

1 个答案:

答案 0 :(得分:2)

csv库旨在获取列条目列表,并通过为您添加必要的分隔符将其自动转换为整个csv行。您的print语句通过在每个列条目之间附加;来模拟此情况。您可以指定创建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=''。此外,在不使用result和索引的情况下直接迭代range()条目也更容易。由于您似乎有两个相等长度的列表,因此您可以使用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的示例,因此这取决于您的示例输出。