【问题标题】:Python: Write list of lists to CSVPython:将列表写入 CSV
【发布时间】:2020-03-10 20:43:48
【问题描述】:

在我的 python 脚本中,我有一个具有以下结构的列表:

['00:00', 'abc', '2', 'xyz']
['00:01', 'cde', '3', 'sda']

等等。我想将此列表写入 csv 文件,使每个元素都在单独的行中,并且一个元素中的每个字符串都在单独的列中。所以我想在 csv 文件中得到以下结果:

     A     |     B    |     C    |     D
1  00:00   |    abc   |     2    |    xyz     
2  00:01   |    xyz   |     3    |    sda

目前我有这样的代码:

with open('test1.csv',mode='w',encoding='UTF-8') as result_file:
    wr = csv.writer(result_file, dialect='excel')
    for x in data:
        wr.writerow(x)

我得到的结果是列表的每个元素都写入A列,所以看起来像这样:

             A               |       
1  '00:00','abc','2','xyz'   |

如何实现将每个字符串拆分为 csv 文件中的单独列?

--编辑

如果我从前三个答案运行代码,我会得到相同的结果(分隔符除外):

但我的想法是在 A 列中获得 00:00,在 B 列中获得 -6 等等..

【问题讨论】:

  • 这是两个列表。您能否确认它是列表列表还是列表字典?
  • 其实它是一个二维数组/列表。整个结构称为数据,我可以通过键入 data[i][j] 来获取每个字符串的值
  • 请分享data的样子?
  • 请提供minimal reproducible example的代码。
  • 对不起,它是列表的列表,所以它有一个结构:[['00:00', 'abc', '2', 'xyz'] ['00:01', 'cde', '3', 'sda'] ]

标签: python python-3.x csv


【解决方案1】:

每个列表在 CSV 文件中的显示方式取决于 data 的数据结构。

要使data 成为列表列表,以下代码应该可以正常工作。

import csv

data = []
d1 = ['00:00', 'abc', '2', 'xyz']
d2 = ['00:01', 'cde', '3', 'sda']

data.append(d1)
data.append(d2)

with open('results_file.csv', mode='w') as results_file:
    results_writer = csv.writer(results_file, delimiter='|', quotechar='"', 
        quoting=csv.QUOTE_MINIMAL)
    results_writer.writerow(['A','B','C','D'])
    for x in data:
        results_writer.writerow(x)

results_file.csv 看起来像:

A|B|C|D
00:00|abc|2|xyz
00:01|cde|3|sda

【讨论】:

  • 好的,但是如果我的数据列表有很多元素而不仅仅是2,我该怎么办?
  • 答案中的代码应该适用于data 中的任意数量的列表元素,而不仅仅是2。我在data 中添加了2 个列表仅作为示例。
【解决方案2】:

pandas 方法怎么样?又好又简单...

import pandas as pd

data = [['00:00', 'abc', '2', 'xyz'], ['00:01', 'cde', '3', 'sda']] 
cols = ['A', 'B', 'C', 'D']

# Load data into a DataFrame.
df = pd.DataFrame(data, columns=cols)
# Write the CSV.
df.to_csv('output.csv', sep='|', index=False)

根据docs,您可以使用sep 参数更改分隔符。

[编辑]输出:

output.csv 的内容如控制台所示:

user@host ~/Desktop/so
$ cat output.csv
A|B|C|D
00:00|abc|2|xyz
00:01|cde|3|sda

【讨论】:

  • 不幸的是它不起作用..仍然所有字符串都写入一列
  • 刚刚在 Libre Calc 中打开了 CSV,每个值都按预期在自己的列中。我将修改输出,因为它具有误导性。
  • @izotop - 我已更新为您使用管道分隔符 |。只需将您喜欢的任何内容传递给sep 参数即可。
猜你喜欢
  • 2021-11-09
  • 1970-01-01
  • 2014-09-21
  • 2016-06-30
  • 1970-01-01
  • 2013-07-16
  • 2012-01-02
  • 1970-01-01
相关资源
最近更新 更多