【问题标题】:Writing arrays to a csv in columns将数组写入列中的 csv
【发布时间】:2016-01-20 23:36:18
【问题描述】:

我一直在尝试解决一个基本问题(并且一直是 Python 2.7,但无处可寻。我有一个带有列标题的 csv 文件,例如:

a,b,c
1,2,3
1,2,3
1,2,3

这被保存为 test1.csv

我已经设法获取每一列并将它们传递到一个数组中,因此每个列标题都位于开头,然后是数据。然后如何将其写回具有相同顺序和结构的新 csv 文件?

import csv

f = open('test1.csv','rb')

reader = csv.reader(f)
headers = reader.next()
print headers

column = {}
for h in headers:
    column[h] = []  

for row in reader:
    for h,v in zip(headers,row):
    column[h].append(v)

【问题讨论】:

  • 我猜pandas 是不可能的?
  • 这怎么是没有逗号的csv?
  • 1/ 编写标题 2/ 使用 SortedDict 保持列的顺序 3/ 旋转您的字典:zip(*d.values())(为您提供每行的列表)
  • 或者如果你不喜欢 SortedDict,zip(*map(lambda x: x[1], sorted(d.items(), key=lambda x: header.index(x[0]))))(但我更喜欢 SortedDict)

标签: python arrays csv file-writing


【解决方案1】:

您可以像这样编写(和读取)数据,它使用defaultdict 而不是普通字典来简化其构造:

from collections import defaultdict
import csv

with open('test1.csv', 'rb') as f:
    reader = csv.reader(f)
    header = next(reader)
    columns = defaultdict(list)
    for row in reader:
        for col,value in zip(header, row):
            columns[col].append(value)
    num_rows = len(columns[header[0]])

# now write data back out in same order

with open('test2.csv', 'wb') as f:
    writer = csv.writer(f)
    writer.writerow(header)
    writer.writerows(
        tuple(columns[col][row] for col in header) for row in xrange(num_rows))

【讨论】:

    猜你喜欢
    • 2019-04-09
    • 2014-02-23
    • 2016-10-26
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-01
    • 2022-09-23
    相关资源
    最近更新 更多