Как записать часть списка в CSV? - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть данные в этих списках.Мне нужно использовать эти определенные элементы в начале строки, а затем добавить 30 точек данных.Я понимаю, как склеить список, но я хочу вернуть эти отдельные элементы из списка

w.writerow([sub_sub_header_list[0], data_list[0:29]])
w.writerow([sub_sub_header_list[1], data_list[30:59]])
w.writerow([sub_sub_header_list[2], data_list[60:89]])
w.writerow([sub_sub_header_list[3], data_list[90:119]])

Я получаю что-то вроде этого:

Team Stats, [u'310', u'5291', u'1018', u'5.2', u'27', u'11', u'289', u'377', u'598', u'3879', u'26', u'16', u'6.3', u'190', u'398', u'1412', u'6', u'3.5', u'73', u'88', u'857', u'26', u'193', u'27.5', u'13.0', u'Own 27.6', u'2:21', u'5.40', u'27.4']

КогдаЯ хочу:

Team Stats, [310, 5291, 1018, ...] и пр.

Ответы [ 3 ]

0 голосов
/ 22 декабря 2018

Если бы я правильно расшифровал ваш вопрос, что-то вроде этого сделало бы:

import csv
from itertools import zip_longest


def grouper(n, iterable, sentinel=object()):
    """ Collect data into fixed-length chunks or blocks. """
    args = [iter(iterable)] * n
    for t in zip_longest(*args, fillvalue=sentinel):
        yield list(elem for elem in t if elem is not sentinel)


# Example usage.
data_list = [u'310', u'5291', u'1018', u'5.2', u'27', u'11', u'289', u'377', u'598',
             u'3879', u'26', u'16', u'6.3', u'190', u'398', u'1412', u'6', u'3.5', u'73',
             u'88', u'857', u'26', u'193', u'27.5', u'13.0', u'Own 27.6', u'2:21',
             u'5.40', u'27.4']
sub_sub_header_list = [u'sub_header_0', u'sub_header_1', u'sub_header_2',
                       u'sub_header_3']

output_filename = 'grouped_data.csv'
group_size = len(sub_sub_header_list)
with open(output_filename, 'w', newline='') as csv_file:
    csv_writer = csv.writer(csv_file)
    for i, group in enumerate(grouper(group_size, data_list)):
        row = [sub_sub_header_list[i%group_size]] + group
        csv_writer.writerow(row)

print('File {!r} written.'.format(output_filename))

Вот содержимое файла csv, созданного с учетом данных примера:

sub_header_0,310,5291,1018,5.2
sub_header_1,27,11,289,377
sub_header_2,598,3879,26,16
sub_header_3,6.3,190,398,1412
sub_header_0,6,3.5,73,88
sub_header_1,857,26,193,27.5
sub_header_2,13.0,Own 27.6,2:21,5.40
sub_header_3,27.4

Примечаниечто, поскольку количество элементов в data_list не было точным кратным числу в sub_sub_header_list, последняя строка не так длинна, как предыдущие.

0 голосов
/ 22 декабря 2018

Вы также можете использовать базовые функции Python для записи файла CSV.

Допустим, ваши данные выглядят следующим образом:

# elements converted to strings:
data_list = list(map(str, numpy.random.randint(1,100,20)))
sub_sub_header_list = ['A','B','C']

Следующий код создаст желаемый список:

rowsize = len(sub_sub_header_list)
outlist=[]
# create header:
outlist.append(",".join(sub_sub_header_list))         
# create rows:
for i in range(0,len(data_list)-rowsize,rowsize):
    outlist.append(",".join(data_list[i:i+rowsize]))  
# show format:
print("\n".join(outlist))            

Вывод в нужном формате:

A,B,C
16,72,38
79,4,37
93,19,77
87,54,87
26,4,17
73,59,56

И CSV-файл может быть произведен:

with open("outfile.csv", "w") as f:     
    f.write("\n".join(outlist))
0 голосов
/ 22 декабря 2018

Имейте в виду, что CSV структурированы в табличной форме (как Excel).Сначала у вас есть заголовок, а затем данные для каждого столбца заголовка в отдельных строках.Когда вы делаете writerow, вы должны предоставить ему фактические значения для конкретных столбцов для текущей записываемой строки.Вы в основном написали пару списков в своем CSV для каждого столбца, выполнив w.writerow([sub_sub_header_list[0], data_list[0:29]]), что по сути w.writerow([1, 2...], [3, 4,...]), поэтому вы получили данные CSV, например:

u'[1,2,..]', u'[3,4,...]'

Это было в основномобрабатывать каждый список как отдельную ячейку и преобразовывать его в строку, чтобы он мог сохранить его в CSV (отсюда и u'').

В основном, вы должны сохранять ссылочный индекс по всему вектору, поскольку это одномерная структура данных, к которой ряды добавляются одна за другой.

import csv

pf = open("out.csv", "w")

csv_writer = csv.DictWriter(pf, fieldnames=["A", "B", "C"])
csv_writer.writeheader()

LENGTH = 3  # number elements per column
data_list = [1, 1, 2, 2, 3, 3]

for i in range(LENGTH):
    csv_writer.writerow({
        'A': data_list[i],
        'B': data_list[i+LENGTH],
        'C': data_list[i+LENGTH*2],
    })

pf.close()

, и результат будет примерно таким:

A,B,C
1,2,3
1,2,3
...