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 циклов
Ответы
Ответ 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)