【问题标题】:Write list elements to fields in a csv-file in python using the csv modul使用 csv 模块将列表元素写入 python 中的 csv 文件中的字段
【发布时间】:2018-10-02 20:56:03
【问题描述】:

我有一个文本文件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*

在我的代码中: 我想用 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 中的内容如下所示:

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 文档,但我不明白。

也许有人可以回答这个问题。

提前致谢

本

【问题讨论】:

  • 您希望该行看起来像什么?你希望它是 A0 0194 7F9E 00 0001 B7AB 或 A0,0194,7F9E,00,0001,B7AB 还是其他?

标签: python python-3.x list csv


【解决方案1】:

您正在使用csv.writerows 编写一个字符串列表,它会写入几行 行。

这个函数接受一个可迭代的迭代。因此,当传递字符串列表时,您会满足输入,但这不是您所期望的:字符串被视为可迭代对象,并且逐个字符地拆分。

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

writer.writerows([x] for x in neue_liste)

(好吧,csv 模块在这种情况下几乎没用,最好在文件句柄上使用 writelines)

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

writer.writerow(neue_liste)

虽然 cmets 明智地建议您希望根据空格再次拆分字符串,但请使用:

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

或

writer.writerows(map(str.split,neue_liste))

【讨论】:

  • 如果他希望行看起来像 A0,0194,7F9E,00,0001,B7AB,他可以使用 neue_liste = [c[i:i+26].split() for i in range(0, len(c), 26)] 并保持其他所有内容不变。
  • 添加。当您使用writerows 时,列表的每个元素都被视为可迭代行。由于它是一个字符串,迭代器将字符串的每个字母视为行的元素。这就是您看到每个元素分开的原因。正如@StevenRumbalski 所写,您也可以选择遍历neue_liste 中的每个element,获取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 这对我完全有用 thx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 2016-09-02
  • 2016-03-26
  • 2012-12-11
  • 1970-01-01
相关资源
最近更新 更多