我有一个文件,其中包含以下格式的行
aaa = A; bbb = B; ccc = C
我想将其转换为csv格式,以便等式两边的文字将是列,而分号将成为行分隔符。我尝试做这样的事情
f = open("aaa.txt", "r")
with open("ccc.csv", 'w') as csvFile:
writer = csv.writer(csvFile)
rows = []
if f.mode == 'r':
single = f.readline()
lns = single.split(";")
for item in lns:
rows.append(item.replace("=", ","))
writer.writerows(rows)
f.close()
csvFile.close()
但是我将每个字母作为一列,所以结果看起来像:
a,a,a,",",A
b,b,b,",",B
c,c,c,",",C,"
预期结果应类似于
aaa,A
bbb,B
ccc,C
答案 0 :(得分:0)
writer.writerows()
的参数必须是行的可迭代行,该行又应是字符串或数字的可迭代行。由于将字符串列表传递给它,因此字符串中的字符被视为单独的字段。您可以通过先在';'
上然后在'='
上分割行来获得正确的行列表:
import csv
with open('in.txt') as in_file, open('out.csv', 'w') as out_file:
writer = csv.writer(out_file)
line = next(in_file).rstrip('\n')
rows = [item.split('=') for item in line.split(';')]
writer.writerows(rows)
答案 1 :(得分:0)
只需将字符串逐行写入目标文件:
import os
f = open("aaa.txt", "r")
with open("ccc.csv", 'w') as csvFile:
single = f.readline()
lns = single.split(";")
for item in lns:
csvFile.write(item.replace("=", ",") + os.linesep)
f.close()
输出为:
aaa,A
bbb,B
ccc,C
答案 2 :(得分:0)
它有助于交互式地执行命令并打印值,或在代码中添加调试打印(一切正常后将被删除或注释)。在这里您可能已经看到rows
是['aaa,A', 'bbb,B', 'ccc,C']
,当它应该是三个序列时,它是3个字符串。
由于字符串是字符(只读)序列writerows
使用每个字符作为字段。
因此,您不想将=
替换为逗号(,
),而是想等号分割:
...
for item in lns:
rows.append(item.split("=", 1))
...
但是csv模块需要正确操作才能使用newline=''
打开输出文件。
所以您应该拥有:
with open("ccc.csv", 'w', newline='') as csvFile:
...
答案 3 :(得分:0)
以下1行更改对我有用:
rows.append(item.split('='))
代替现有代码
rows.append(item.replace("=", ",")).
这样,我能够创建一个列表列表,以便于编写者轻松阅读,从而使row
列表看起来像[['aaa', 'A'], ['bbb', 'B'], ['ccc', 'C']]
而不是['aaa,A', 'bbb,B', 'ccc,C']