Записать список в файл csv по вертикали

#python #list #csv

#python #Список #csv

Вопрос:

Каков наилучший способ использовать набор списков и создать или экспортировать эти данные в файл csv?

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

 signals = ['-108', '-107', '-107', '-107', '-107', '-107', '-94', '-87', '-108']

Costs = ['8325', '5175', '2698', '1754', '4767', '3652', '2417', '7527', '3698']
 

Что я хотел бы:

введите описание изображения здесь

Я получаю файл следующим образом: введите описание изображения здесь

Часть моего кода, которая записывается в файл csv:

 import csv

fieldnames = ['Signals','Costs']

s = ' '.join(signals)
c = ' '.join(costs)

with open('Data_to_Csv.csv', 'w') as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerow({'Signals':s,'Costs':c})
 

Комментарии:

1. » Мне удалось удалить запятые и кавычки из списков» очень важно понимать , что ваши списки не содержат ни запятых, ни кавычек

2. writer.writerow({'Signals':s,'Costs':c}) создает одну строку, это явно не то, что вы хотите

3. Кроме того, похоже, что вы используете программное обеспечение для работы с электронными таблицами для чтения вашего CSV. Проблема в том, что ваш файл интерпретируется на основе того, однако ваше программное обеспечение для работы с электронными таблицами настроено на чтение CSV …. в этом случае, похоже, запятые не используются в качестве разделителя. Почему бы вам просто не предоставить фактические CSV, которые вам требуются, и которые вы получаете? В общем, вы должны предоставлять данные в виде текста, если это возможно, и, конечно же, ваши данные не должны предоставляться в виде неоднозначных скриншотов какой-либо другой программы , в данном случае Excel, предположительно

4. В любом случае, то, что вам действительно нужно, это просто writer = csv.writer(csvfile) , тогда сделайте writer.writerow(fieldnames) тогда writer.writerows(zip(signals, costs))

Ответ №1:

Я предполагаю, что длина сигналов и Стоимость одинаковы. Если это правда, то вот в чем ваша проблема:

 s = ' '.join(signals)
c = ' '.join(costs)
 

Что это делает , так это создает строку с именем s , значением которой являются все числа в signals , соединенные вместе пробелами , и строку с именем c , значением которой являются все числа costs в. Таким образом, эффективно вы будете иметь следующее:

 >>> signals = ['-108', '-107', '-107', '-107', '-107', '-107', '-94', '-87', '-108']
>>> costs = ['8325', '5175', '2698', '1754', '4767', '3652', '2417', '7527', '3698']
>>> s = ' '.join(signals)
>>> c = ' '.join(costs)
>>> print(s)
-108 -107 -107 -107 -107 -107 -94 -87 -108
>>> print(c)
8325 5175 2698 1754 4767 3652 2417 7527 3698
 

Поэтому, когда вы вызываете writer.writerow({'Signals': s, 'Costs': c}) , он просто объединит две строки с a ',' между ними. Это то, что вы видите в своем результирующем CSV-файле.

Все, что вам нужно сделать, это перебрать список и для каждого индекса в signals получить стоимость, а затем записать ее в свой CSV-файл. Что-то вроде этого:

 with open('Data_to_Csv.csv', 'w') as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    for i in range(len(signals)):
        writer.writerow({'Signals':signals[i],'Costs':costs[i]})
 

Это приведет к созданию файла Data_to_Csv.csv, подобного этому:

 Signals,Costs
-108,8325
-107,5175
-107,2698
-107,1754
-107,4767
-107,3652
-94,2417
-87,7527
-108,3698
 

Обратите внимание , что этот подход будет работать только в том случае , если len(signals) == len(costs) . Если это неправда, вам нужно разобраться с этим делом.

Ответ №2:

используйте pandas.DataFrame.to_csv from pandas и экспортируйте свои текущие данные в файл csv.

 >>> import pandas 
>>> signals = ['-108', '-107', '-107', '-107', '-107', '-107', '-94', '-87', '-108']
>>> costs = ['8325', '5175', '2698', '1754', '4767', '3652', '2417', '7527', '3698']
>>> df = pandas.DataFrame({'Signals':signals, 'Costs':costs})
>>> df.to_csv(index=False)
'Signals,Costsrn-108,8325rn-107,5175rn-107,2698rn-107,1754rn-107,4767rn-107,3652rn-94,2417rn-87,7527rn-108,3698rn'
 

сжатие и запись csv файла:

 >>> compression_opts = dict(method='zip', archive_name='out.csv')
>>> df.to_csv(index=False, compression=compression_opts)
 

файл csv

Ответ №3:

Просто используйте csv :

 import csv

signals = ['-108', '-107', '-107', '-107', '-107', '-107', '-94', '-87', '-108']
costs = ['8325', '5175', '2698', '1754', '4767', '3652', '2417', '7527', '3698']

with open("Data_to_Csv.csv", "w") as f:
    writer = csv.writer(f)
    writer.writerow(["Signals", "Costs"])
    writer.writerows(zip(signals, costs))
 

Но если вы найдете convtools полезным, то вы могли бы:

 from convtools.contrib.tables import Table

Table.from_rows(
    zip(signals, costs),
    header=["Signals", "Costs"]
).into_csv("Data_to_Csv.csv")