#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)
Ответ №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")