将与打印命令相同的内容保存到 .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
提供示例,因此这是基于您的示例输出。
显示如下内容的打印命令(我有 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
提供示例,因此这是基于您的示例输出。