Подтвердить что ты не робот

Python: CSV пишется по столбцу, а не по строке

У меня есть python script, который генерирует кучу данных в цикле while. Мне нужно записать эти данные в CSV файл, поэтому он пишет по столбцу, а не по строке.

Например, в цикле 1 моего script я генерирую:

(1, 2, 3, 4)

Мне нужно это, чтобы отразить в моем csv script так:

Result_1    1
Result_2    2
Result_3    3
Result_4    4

В моем втором цикле я генерирую:

(5, 6, 7, 8)

Мне нужно это, чтобы посмотреть в моем файле csv следующим образом:

Result_1    1    5
Result_2    2    6
Result_3    3    7
Result_4    4    8

и т.д., пока цикл while не завершится. Кто-нибудь может мне помочь?


ИЗМЕНИТЬ

Цикл while может содержать более 100 000 циклов

4b9b3361

Ответ 1

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

>>> l = [('Result_1', 'Result_2', 'Result_3', 'Result_4'), (1, 2, 3, 4), (5, 6, 7, 8)]
>>> zip(*l)
[('Result_1', 1, 5), ('Result_2', 2, 6), ('Result_3', 3, 7), ('Result_4', 4, 8)]

Ответ 2

Обновление строк в файле не поддерживается в большинстве файловых систем (строка в файле - это всего лишь некоторые данные, которые заканчиваются символом новой строки, после чего начинается следующая строка).

Как я вижу, у вас есть два варианта:

  • Генерируют ли генераторы данных генераторы, поэтому они не будут потреблять много памяти - вы получите данные для каждой строки "как раз вовремя"
  • Использовать базу данных (sqlite?) и обновлять там строки. Когда вы закончите - экспортируете в CSV

Небольшой пример для первого метода:

from itertools import islice, izip, count
print list(islice(izip(count(1), count(2), count(3)), 10))

Откроется

[(1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6), (5, 6, 7), (6, 7, 8), (7, 8, 9), (8, 9, 10), (9, 10, 11), (10, 11, 12)]

хотя count порождает бесконечную последовательность чисел

Ответ 3

wr.writerow(item) # столбца по столбцу

wr.writerows(item) #row by row

Это довольно просто, если ваша цель - просто написать столбец вывода по столбцу.

, если ваш элемент списка -

yourList = []

с открытым ('yourNewFileName.csv', 'w',) как myfile:

wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)

for word in yourList:

    wr.writerow([word])

Ответ 4

как насчет Result_* там также генерируются в цикле (потому что я не думаю, что можно добавить в файл csv)

я пойду вот так; сгенерировать все данные при одном вращении матрицы в файле:

A = []

A.append(range(1, 5))  # an Example of you first loop

A.append(range(5, 9))  # an Example of you second loop

data_to_write = zip(*A)

# then you can write now row by row

Ответ 5

Прочитайте его по строке и затем перенесите в командной строке. Если вы используете Unix, установите csvtool и следуйте указаниям в: https://unix.stackexchange.com/a/314482/186237

Ответ 6

В качестве альтернативного потокового подхода:

  • dump каждый col в файл
  • используйте команду python или unix paste, чтобы вернуться на вкладку, csv, что угодно.

Оба этапа должны обрабатывать парение просто отлично.

Ловушки:

  • Если у вас 1000 столбцов, вы можете столкнуться с ограничением дескриптора файла unix!

Ответ 7

Предположим, что (1) у вас нет большой памяти (2) у вас есть заголовки строк в списке (3) все значения данных - это float; если они все целые числа до 32 или 64 бит, это еще лучше.

На 32-битном Python сохранение float в списке занимает 16 байтов для объекта float и 4 байта для указателя в списке; всего 20. Сохранение float в array.array('d') занимает всего 8 байт. Все более впечатляющие сбережения доступны, если все ваши данные являются int (любые негативы?), Которые будут вписываться в 8, 4, 2 или 1 байт - особенно на недавнем Python, где все ints являются longs.

Следующий псевдокод предполагает float, хранящийся в array.array('d'). Если у вас действительно нет проблемы с памятью, вы все равно можете использовать этот метод; Я добавил комментарии, чтобы указать необходимые изменения, если вы хотите использовать список.

# Preliminary:
import array # list: delete
hlist = []
dlist = []
for each row: 
    hlist.append(some_heading_string)
    dlist.append(array.array('d')) # list: dlist.append([])
# generate data
col_index = -1
for each column:
    col_index += 1
    for row_index in xrange(len(hlist)):
        v = calculated_data_value(row_index, colindex)
        dlist[row_index].append(v)
# write to csv file
for row_index in xrange(len(hlist)):
    row = [hlist[row_index]]
    row.extend(dlist[row_index])
    csv_writer.writerow(row)