使用csv模块将列表元素写入python中csv文件中的字段

使用csv模块将列表元素写入python中csv文件中的字段,python,python-3.x,list,csv,Python,Python 3.x,List,Csv,我得到一个文本文件BM.txt内容如下: *A0 0194 7F9E 00 0001 B7AB A0 0194 7F9E 00 0001 B7BE A0 0194 7F9E 00 0001 B7CD A0 0194 7F9E 00 0001 B7D4* A,0, ,0,1,9,4, ,7,F,9,E, ,0,0, ,0,0,0,1, ,B,7,A,B, A,0, ,0,1,9,4, ,7,F,9,E, ,0,0, ,0,0,0,1, ,B,7,B,E, A,0, ,0,1,9,4, ,7

我得到一个文本文件BM.txt内容如下:

*A0 0194 7F9E 00 0001 B7AB A0 0194 7F9E 00 0001 B7BE A0 0194 7F9E 00 0001  B7CD A0 0194 7F9E 00 0001 B7D4*
A,0, ,0,1,9,4, ,7,F,9,E, ,0,0, ,0,0,0,1, ,B,7,A,B, 
A,0, ,0,1,9,4, ,7,F,9,E, ,0,0, ,0,0,0,1, ,B,7,B,E, 
A,0, ,0,1,9,4, ,7,F,9,E, ,0,0, ,0,0,0,1, ,B,7,C,D, 
....
在我的代码中: 我想用26个字符来分隔元素。26个字符的每个元素都是列表中的一个元素:

import csv #import csv modul using writerows function 
#csv docs https://docs.python.org/3/library/csv.html

#open the file with the string element to seperate bm elements.
    file = open("BM.txt", "r")
    c = file.read()
#list comp that seperates the elements by 26 charackters each
    neue_liste = [c[i:i+26] for i in range(0, len(c), 26)] 

#creating a new file with the bm elements as comma seperated values
    with open('briefmarken.csv', 'w', newline='') as f:
        writer = csv.writer(f)
        writer.writerows(neue_liste)
    file.close()
列表理解的结果看起来很有希望:

['A0 0194 7F9E 00 0001 B7AB ', 'A0 0194 7F9E 00 0001 B7BE ', 'A0 0194 7F9E 00 0001 B7CD ',.....]
但当我最终使用writerow()函数编写列表时。 csv中的内容如下所示:

*A0 0194 7F9E 00 0001 B7AB A0 0194 7F9E 00 0001 B7BE A0 0194 7F9E 00 0001  B7CD A0 0194 7F9E 00 0001 B7D4*
A,0, ,0,1,9,4, ,7,F,9,E, ,0,0, ,0,0,0,1, ,B,7,A,B, 
A,0, ,0,1,9,4, ,7,F,9,E, ,0,0, ,0,0,0,1, ,B,7,B,E, 
A,0, ,0,1,9,4, ,7,F,9,E, ,0,0, ,0,0,0,1, ,B,7,C,D, 
....
这对我的工作来说已经足够好了,但我想知道为什么现在每个字符都是逗号分隔的?我在看帖子和csv文档,但我不明白

也许有人能回答这个问题

提前谢谢


Ben

您正在使用
csv.writerows
编写一个字符串列表,其中写入了几行

此函数接受iterable的iterable。因此,当传递字符串列表时,您满足了输入,但这不是您所期望的:字符串被视为可编辑的,并且是逐字符分割的

要写入所有数据(每行1个字符串),请使用:

writer.writerows([x] for x in neue_liste)
(在这种情况下,
csv
模块几乎没有用处,最好在文件句柄上使用
writelines

要将所有数据写入一行,请使用
writerow
(注意最后缺少
s
):

尽管注释明智地建议您要根据空格再次拆分字符串,但请使用:

writer.writerows(x.split() for x in neue_liste)


你想让这一排看起来像什么?你希望它是
A00194 7F9E 00 0001B7AB
还是
A00194,7F9E,000001,B7AB
或其他什么?他很可能希望行看起来像
A00194,7F9E,000001,B7AB
他可以做
neue_liste=[c[i:i+26]。在范围(0,len(c),26)]内对i进行拆分()
,其他一切保持不变。添加。使用
writerows
时,列表中的每个元素都被视为可编辑行。由于它是一个字符串,迭代器将字符串的每个字母视为行的元素。这就是为什么每个元素都是分开的。正如@StevenRumbalski所写的那样,您也可以通过
neue_liste
的每个
元素
,获取
row=element.split()
,然后使用
writer.writerow(row)
。这是很好的选择。用第三种选择编辑,可能是op想要的。非常感谢!我希望元素将每个元素拆分成一行。与A0 0194 7F9E 00 0001 B7AB A0 0194 7F9E 00 0001 B7BE A0 0194 7F9E 00 0001 B7CD A0 0194 7F9E 00 0001 B7D4一样,这完全适用于我