【问题标题】:How to export array in csv or txt in Python如何在 Python 中以 csv 或 txt 格式导出数组
【发布时间】:2024-05-04 22:25:06
【问题描述】:

我正在尝试将数组导出到 txt 或 csv 文件。我一直在尝试使用 numpy,但我总是遇到一些错误,例如 TypeError: Mismatch between array dtype ('<U14') and format specifier ('%.18e')

这是我没有 numpy 的代码,效果很好,但我需要有关如何导出它的部分帮助。

peoples = []
for content in driver.find_elements_by_class_name('x234'):
    people = content.find_element_by_xpath('.//div[@class="zstrim"]').text
    if people != "Django" and people != "Rooky" :
        pass
        peoples.append([people, 1, datetime.now().strftime("%d/%m/%y %H:%M")])
print(peoples)

确实需要一些帮助。

【问题讨论】:

标签: python arrays csv numpy


【解决方案1】:

看起来你正在做类似的事情:

In [1339]: peoples=[]

In [1340]: for _ in range(3):
   ......:     peoples.append([234, datetime.datetime.now().strftime("%d/%m/%y %H:%M")])
   ......:     

In [1341]: peoples
Out[1341]: [[234, '22/06/16 14:57'], [234, '22/06/16 14:57'], [234, '22/06/16 14:57']]

peoples 是一个数组(或此处的列表列表),其中包含格式化日期等内容。

In [1342]: np.savetxt('test.txt',peoples)
...    
TypeError: Mismatch between array dtype ('<U14') and format specifier ('%.18e %.18e')

由于我没有指定fmt,它构建了一个默认的,由两个%.18e 字段组成。这对于数字的一般格式非常有用。但数据包含 14 个字符串('U14' - Python3 中的 unicode)。

如果我告诉它使用%s,通用字符串格式,我会得到:

In [1346]: np.savetxt('test.txt',peoples, fmt='%s', delimiter=',')

In [1347]: cat test.txt
234,22/06/16 14:57
234,22/06/16 14:57
234,22/06/16 14:57

不理想,但它仍然有效。 fmt='%20s' 会更好。

我掩盖了另一个细微差别。 peoples 是一个列表列表。 np.savetxt 适用于数组,因此它首先将其转换为数组:

In [1360]: np.array(peoples)
Out[1360]: 
array([['234', '22/06/16 14:57'],
       ['234', '22/06/16 14:57'],
       ['234', '22/06/16 14:57']], 
      dtype='<U14')

但这会将两列都转换为U14 字符串。所以我必须用%s 格式化两列。我不能在第一个上使用数字格式。我首先需要做的是创建一个包含数字字段和字符串字段的结构化数组。我知道该怎么做,但我现在不会详细说明。

根据 cmets,将每个 peoples 行格式化为一个完整的字符串并将其写入文件可能会更简单。

In [1378]: with open('test.txt','w') as f:
    for _ in range(3):
        f.write('%10d,%20s\n'%(234, datetime.datetime.now().strftime("%d/%m/%y %H:%M")))
   ......:         

In [1379]: cat test.txt
       234,      22/06/16 15:18
       234,      22/06/16 15:18
       234,      22/06/16 15:18

【讨论】:

  • 好的,这很有帮助,因为现在我明白问题出在哪里了。多亏了你,我使用了你的最后一部分代码,浏览了更多内容并找到了解决方案。所以这是每次运行时都会追加的最终结果我在pass之后添加了这个......mybook = open('archive.csv', 'a') mybook.write('%20s,%20s\n'%(people, datetime.now().strftime("%d/%m/%y %H:%M"))) mybook.close()
【解决方案2】:

hpauj's 答案解释了为什么您的代码出错,但使用 csv 库并随手编写可能会容易得多:

import csv

with open("out.csv", "w") as f:
    wr = csv.writer(f)
    for content in driver.find_elements_by_class_name('x234'):
        people = content.find_element_by_xpath('.//div[@class="zstrim"]').text
        if people != "Django" and people != "Rooky":
            wr.writerow([people, 1, datetime.now().strftime("%d/%m/%y %H:%M")])

【讨论】:

  • 是的 csv 更简单。感谢这段代码,它有很大帮助!但我必须承认 hpauj 的回答帮助我理解了它的工作原理。
最近更新 更多